如何创建一个Action <t>形成一个通过Reflection给出的对象方法?</t>

时间:2015-03-27 06:01:48

标签: c# .net generics reflection lambda

我有一个void SubscribeToPublish<TMessage>(Action<TMessage> action)方法。它期望Action<T>。我有一个纯粹来自Type的对象,其形式如下:

var Node =  Activator.CreateInstance(type);
var methods = type.GetMethods(BindingFlags.Public).Where(methodInfo => methodInfo.GetParameters().Count() == 1).ToList();
methods.ForEach(methodInfo => {
    SubscribeToPublish(o => methodInfo.Invoke( pair.Value.Node, o )); // Here I see error cannot be inferred from usage.
});

因此我想知道:如何通过反射创建对象来创建Action<T>

1 个答案:

答案 0 :(得分:4)

methodInfo.Invoke接受任意对象参数。因此,编译器无法推断出您所指的具体TMessage类型。

解决方案是明确指定:

SubscribeToPublish((MyMessage o) => methodInfo.Invoke(pair.Value.Node, 
                                                      new object[] {o}));