从Reflection </t,>调用Func <t,tresult =“”>

时间:2010-12-21 17:34:21

标签: c#

最后,我已经能够通过反射,Func<T, TResult>类型的成员,现在,我该如何调用它?

当我检索它时,我通过 Type.GetMembers 方法执行此操作,并返回成员信息类型,该类型没有调用方法;我怎么能调用它?

再次提醒大家,先谢谢! =)

3 个答案:

答案 0 :(得分:5)

获得Func<T, TResult>的实例后,您可以将其转换为Delegate,并在其上调用DynamicInvoke方法,以便您在反射中调用代理场景(只要参数类型匹配!)

答案 1 :(得分:3)

为了获得方法的委托,您需要调用传递泛型类型参数的MakeGenericMethod - 这将返回一个可调用的委托:

var constructedMethod 
    = yourMethodInfo.MakeGenericMethod(typeof(int), typeof(string));
constructedMethod.Invoke(yourInstance, yourArguments);

如果您感到好奇,那么您需要执行此操作的原因是因为您当前持有的MethodInfo实例是 open ,这意味着没有绑定泛型类型参数(和自然这个方法无法调用,这就是为什么没有Invoke方法可用的原因。通过调用MakeGenericMethod,您将使用泛型类型参数显式构造方法。

供参考 - MakeGenericMethod

  

[返回]表示的MethodInfo对象   由...构成的构造方法   代替。的元素   type参数的typeArguments   目前的通用方法   定义

答案 2 :(得分:1)

  

当我检索它时,我通过 Type.GetMembers 方法执行此操作,并返回成员信息类型,该类型没有调用方法;我怎么能调用它?

将对象强制转换为类型MethodInfo - 这确实有一个Invoke方法。

或者,如果这是一个字段或属性,则必须使用反射获取该值,然后将其转换为适当的委托类型,然后可以调用该类型。