C# 使用CodeDom从外部类调用方法
我有两种方法;其中一个位于类外部,另一个位于类内部。我希望能够使用CodeDom从类外的方法调用类内的方法。通过使用代码,这将更容易解释 内部有方法的类:C# 使用CodeDom从外部类调用方法,c#,class,methods,codedom,C#,Class,Methods,Codedom,我有两种方法;其中一个位于类外部,另一个位于类内部。我希望能够使用CodeDom从类外的方法调用类内的方法。通过使用代码,这将更容易解释 内部有方法的类: public static class Public { public static byte[] ReadAllData(string sFilePath) { byte[] b = new byte[sFilePath.Length]; b = System.IO.File.ReadAllB
public static class Public
{
public static byte[] ReadAllData(string sFilePath)
{
byte[] b = new byte[sFilePath.Length];
b = System.IO.File.ReadAllBytes(sFilePath);
return b;
}
}
**来自另一个班级:
Public.ReadAllData(@"C:\File.exe");
我想使用CodeDom
-
CodeMemberMethod method = new CodeMemberMethod();
method.Statements.Add(new CodePropertyReferenceExpression(
new CodeVariableExpression("Public"), "ReadAllData"));
上述代码将生成以下输出-但请注意,我无法传递任何参数强>
Public.ReadAllData;
我只使用了一点CodeDom,但我认为您需要的是,而不是CodePropertyReferenceExpression。看起来CodePropertyReferenceExpression正在生成一个访问属性值的语句,而不是调用一个方法 CodeMethodInvokeeExpression上有一个Parameters属性,允许您指定要传递给要调用的方法的参数
var compiler = new CSharpCodeProvider();
var invocation = new CodeMethodInvokeExpression(
new CodeTypeReferenceExpression(typeof(Public)),
"ReadAllData", new CodePrimitiveExpression(@"C:\File.exe"));
var stringWriter = new StringWriter();
compiler.GenerateCodeFromExpression(invocation, stringWriter, null);
Console.WriteLine(stringWriter.ToString());
此代码生成结果
ConsoleApplication1.Public.ReadAllData("C:\\File.exe")
另一个选择是
var invocation = new CodeMethodInvokeExpression(
new CodeMethodReferenceExpression(
new CodeTypeReferenceExpression(typeof(Public)),"ReadAllData"),
new CodePrimitiveExpression(@"C:\File.exe"));
在调用泛型方法时,使用
CodeMethodReferenceExpression
这种方式可能很有用:您可以在其构造函数中指定类型参数。为什么需要使用CodeDom来完成此操作?你想解决的是什么?我的项目的全部目的是使用CodeDom…为什么人们总是试图如此伤害自己?:)@Tigran,有些情况下动态生成代码是有用的。我认为使用Reflection.Emit比CodeDom要痛苦得多,表达式不能用于所有事情,而且在.Net 3.5中缺少重要功能。@tigran我在编程方面所做的努力让我如此感兴趣!:)是的,我可以将参数传递给单个类中的方法,但是我不知道如何将参数传递给另一个类的方法。这是我的主要问题。谢谢你的回复。是的,对不起,我的代码大脑有太多蜘蛛网,无法回忆起它到底是如何工作的。从3.5开始,我一直在使用ExpressionTrees进行这类工作,所以我失去了所有以前的CodeDom foo