【问题标题】:Call method from an outside class using CodeDom使用 CodeDom 从外部类调用方法
【发布时间】:2011-07-12 18:46:09
【问题描述】:

我有两种方法;其中一个位于类外,另一个位于类内。我希望能够使用 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 来做到这一点?你想解决什么问题?
  • 我的项目的全部目的是使用 CodeDom ...
  • 为什么人们总是想伤害自己这么多..?:)
  • @Tigran,在某些情况下动态生成代码很有用。而且我认为使用 Reflection.Emit 比 CodeDom 更痛苦,并且 Expressions 不能用于所有事情,并且在 .Net 3.5 中缺乏重要功能。
  • @tigran 我在编程方面遇到的困难让我如此着迷! :)

标签: c# class methods codedom


【解决方案1】:
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 在调用泛型方法时可能很有用:您可以在其构造函数中指定类型参数。

【讨论】:

    【解决方案2】:

    我只使用了一点 CodeDom,但我认为您会想要 CodeMethodInvokeExpression,而不是 CodePropertyReferenceExpression。看起来 CodePropertyReferenceExpression 正在生成一个访问属性值的语句,而不是调用方法。

    CodeMethodInvokeExpression 上有一个 Parameters 属性,可让您指定要传递给要调用的方法的参数。

    【讨论】:

    • 是的,将参数传递给单个类中的方法没有问题,但我不知道如何将参数传递给另一个类的方法。这是我的主要问题。不过感谢您的回复。
    • 是的,抱歉,我的 CodeDom 大脑中有太多蜘蛛网,无法回忆起它是如何工作的。自 3.5 以来,我一直在使用 ExpressionTrees 进行此类工作,因此我失去了所有以前的 CodeDom foo
    猜你喜欢
    • 2021-01-30
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多