获取C#中变量下函数的MethodInfo

Get MethodInfo of a function under a variable in C#

我在 C# 中有一个特定的对象,将其命名为 MyCustomObjectMyCustomObject 属于 MyNamespace.CustomObject 类型,并且该类型的每个对象都包含一个方法 MyCustomMethod。我正在尝试获取 MyCustomObject.MyCustomMethodMethodInfo (System.Reflection.MethodInfo),以便稍后可以使用它来创建表达式树。但是,如果我只使用 typeof(MyCustomObject).GetMethod("MyMethodInfo"),它 returns 是所有 MyNamespace.CustomObject 类型对象的通用方法。我怎样才能得到 MyCustomObject.MyCustomMethodMethodInfo

创建表达式树时(根据 ), you presumably want to use the Call 工厂方法。

在您的例子中,您正在尝试创建一个表示 实例方法调用 而不是 静态方法调用 的表达式树;它们之间的区别是实例方法调用使用实例,而静态方法调用不。

要创建这样的表达式树,您需要某种表示实例的表达式树;它可能是 属性 或字段,或者另一个方法调用的结果。但是如果你想将它应用到一个现有的实例,你可以将你的实例传递给 Constant 工厂方法。

您可以将此节点传递到表示实例方法调用的 Call 重载之一,例如 this one,用于不带参数的实例方法调用。

像这样:

// using System.Linq.Expressions.Expression

CustomObject MyCustomObject = /* initialized somehow */
var methodInfo = typeof(CustomObject).GetMethod("MyCustomMethod");
var expr = Lambda(
    Call(
        Constant(MyCustomObject),
        methodInfo
    ),
    new ParameterExpression[] { }  // if the LambdaExpression has parameters, add them here
);

附录

使用编译器生成类似表达式树时:

CustomObject MyCustomObject = /* initialized somehow */
Expression<Action> expr = () => MyCustomObject.MyCustomMethod();

MyCustomObject 不是用 ConstantExpression 表示,而是用 MemberAccessExpression 表示。 C# 编译器将 closed-over 变量(在本例中,lambda 表达式中的 MyCustomObject)重写为对 compiler-generated 对象的 属性 访问。表示 MyCustomObject 的相应工厂方法不是对 Constant 的调用,而是如下所示:

// using System.Linq.Expressions.Expression

PropertyOrField(
    Constant(<<closure_object>>),
    "MyCustomObject"
)

我们不能在代码中写这样的东西,因为我们的代码无法访问 <<closure_object>> 实例。