首页 / C# / c# – 代码和字符串处理
c# – 代码和字符串处理
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 代码和字符串处理,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5157字,纯文字阅读大概需要8分钟。
内容图文
![c# – 代码和字符串处理](/upload/InfoBanner/zyjiaocheng/798/ebccd1c3261b42e8b109e9a39cfd484b.jpg)
我已经研究过这个,但找不到任何可靠的东西,想看看是否有人可以指出我正确的方向.我试图看看Codedom是否可以处理不同语言之间的字符串和统一,而不是我为每种语言设置条件字符串.
例如,我需要通过Codedom在C#和VB.NET中完全如下所示生成以下内容:
C#
errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");
System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
VB.NET
errorMsg = errorMsg.Replace(""""c, "'"c).Replace(ChrW(13) & ChrW(10), "\n")
System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(""Unhandled Error in Silverlight Application " + errorMsg + """);")
errorMsg.Replace和System.Windows.Browser.HtmlPage.Window.Eval的CodeMethodInvokeExpression非常简单,如果Codedom可以自动处理的话,我们无法弄清楚它们里面的字符串.
解决方法:
遗憾的是,代码原语在组合时并不总是产生所需的结果,因为提供者将采取某些自由来解释意图.解决这个问题的方法是使用CodeSnippetExpression.
这是代码(VB.NET& C#),用于生成您在问题中列出的Eval语句.随意使用最适合您的方式:
VB.NET版本
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.Reflection
Imports System.Text
Imports System.IO
Imports Microsoft.CSharp
Public Class PrintEvalStatement
Public provider As CodeDomProvider
Sub New()
Dim left As New CodePrimitiveExpression("throw new Error(""Unhandled Error in Silverlight Application ")
Dim middle As New CodeVariableReferenceExpression("errorMsg")
Dim right As New CodePrimitiveExpression(""");")
Dim targetObject = New CodeTypeReferenceExpression("System.Windows.Browser.HtmlPage.Window")
Dim methodName = "Eval"
provider = New VBCodeProvider()
Dim vbStatement As String = ConcatStatement(left, middle, right, targetObject, methodName)
provider = New CSharpCodeProvider()
Dim csStatement As String = ConcatStatement(left, middle, right, targetObject, methodName)
Console.WriteLine(vbStatement)
Console.WriteLine(csStatement)
Console.ReadLine()
End Sub
Private Function ConcatStatement(ByVal left As CodePrimitiveExpression,
ByVal middle As CodeVariableReferenceExpression,
ByVal right As CodePrimitiveExpression,
ByVal targetObject As CodeTypeReferenceExpression,
ByVal methodName As String) As String
Dim evalMessage As New CodeExpression
evalMessage = ConcatString(left, middle, right)
Dim eval As New CodeMethodInvokeExpression(targetObject, methodName, evalMessage)
Dim evalStatement As New CodeExpressionStatement(eval)
Dim sw As StringWriter = New StringWriter()
Using tx As TextWriter = New StringWriter()
provider.GenerateCodeFromStatement(evalStatement, tx, New CodeGeneratorOptions())
Return tx.ToString()
End Using
End Function
Private Function ConcatString(ByVal left As CodeExpression,
ByVal middle As CodeExpression,
ByVal right As CodeExpression) As CodeExpression
Return New CodeSnippetExpression(CodeToString(left) + " + " + CodeToString(middle) + " + " + CodeToString(right))
End Function
Private Function CodeToString(ByVal expr As CodeExpression) As String
Using tx As TextWriter = New StringWriter()
provider.GenerateCodeFromExpression(expr, tx, New CodeGeneratorOptions())
Return tx.ToString()
End Using
End Function
End Class
C#版本
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Reflection;
using System.Text;
using System.IO;
using Microsoft.CSharp;
using Microsoft.VisualBasic;
namespace CodeDom
{
class Program
{
static CodeDomProvider provider;
static void Main(string[] args)
{
Program shell = new Program();
provider = new VBCodeProvider();
CodePrimitiveExpression left = new CodePrimitiveExpression("throw new Error(\"Unhandled Error in Silverlight Application\")");
CodeVariableReferenceExpression middle = new CodeVariableReferenceExpression("errorMsg");
CodePrimitiveExpression right = new CodePrimitiveExpression("\");");
CodeTypeReferenceExpression targetObject = new CodeTypeReferenceExpression("System.Windows.Browser.HtmlPage.Window");
string methodName = "Eval";
string vbStatement = shell.ConcatStatement(left, middle, right, targetObject, methodName);
provider = new CSharpCodeProvider();
string csStatement = shell.ConcatStatement(left, middle, right, targetObject, methodName);
Console.WriteLine(vbStatement);
Console.WriteLine(csStatement);
Console.ReadLine();
}
public string ConcatStatement(CodePrimitiveExpression left, CodeVariableReferenceExpression middle, CodePrimitiveExpression right, CodeTypeReferenceExpression targetObject, string methodName)
{
CodeExpression evalMessage = new CodeExpression();
evalMessage = ConcatString(left, middle, right);
CodeMethodInvokeExpression eval = new CodeMethodInvokeExpression(targetObject, methodName, evalMessage);
CodeExpressionStatement evalStatement = new CodeExpressionStatement(eval);
using (TextWriter tx = new StringWriter())
{
provider.GenerateCodeFromStatement(evalStatement, tx, new CodeGeneratorOptions());
return tx.ToString();
}
}
private CodeExpression ConcatString(CodeExpression left, CodeExpression middle, CodeExpression right) {
return new CodeSnippetExpression(CodeToString(left) + " + " + CodeToString(middle) + " + " + CodeToString(right));
}
private string CodeToString(CodeExpression expr) {
using (TextWriter tx = new StringWriter()) {
provider.GenerateCodeFromExpression(expr,tx, new CodeGeneratorOptions());
return tx.ToString();
}
}
}
}
内容总结
以上是互联网集市为您收集整理的c# – 代码和字符串处理全部内容,希望文章能够帮你解决c# – 代码和字符串处理所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。