C# 使用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

我有两种方法;其中一个位于类外部,另一个位于类内部。我希望能够使用CodeDom从类外的方法调用类内的方法。通过使用代码,这将更容易解释

内部有方法的类:

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