获取C#中变量下函数的MethodInfo
Get MethodInfo of a function under a variable in C#
我在 C# 中有一个特定的对象,将其命名为 MyCustomObject
。 MyCustomObject
属于 MyNamespace.CustomObject
类型,并且该类型的每个对象都包含一个方法 MyCustomMethod
。我正在尝试获取 MyCustomObject.MyCustomMethod
的 MethodInfo
(System.Reflection.MethodInfo
),以便稍后可以使用它来创建表达式树。但是,如果我只使用 typeof(MyCustomObject).GetMethod("MyMethodInfo")
,它 returns 是所有 MyNamespace.CustomObject
类型对象的通用方法。我怎样才能得到 MyCustomObject.MyCustomMethod
的 MethodInfo
?
创建表达式树时(根据 ), 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>>
实例。
我在 C# 中有一个特定的对象,将其命名为 MyCustomObject
。 MyCustomObject
属于 MyNamespace.CustomObject
类型,并且该类型的每个对象都包含一个方法 MyCustomMethod
。我正在尝试获取 MyCustomObject.MyCustomMethod
的 MethodInfo
(System.Reflection.MethodInfo
),以便稍后可以使用它来创建表达式树。但是,如果我只使用 typeof(MyCustomObject).GetMethod("MyMethodInfo")
,它 returns 是所有 MyNamespace.CustomObject
类型对象的通用方法。我怎样才能得到 MyCustomObject.MyCustomMethod
的 MethodInfo
?
创建表达式树时(根据 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>>
实例。