【发布时间】:2015-03-27 06:01:48
【问题描述】:
我有一个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>?
【问题讨论】:
-
你能提供错误信息和堆栈跟踪吗?
-
你的错误是发生在编译时还是运行时?我猜你应该使用 (TMessage msg) => methodInfo.Invoke(pair.Value.Node, msg)
-
必须通过反射吗? Linq 表达式编译呢?
-
顺便说一句。鉴于您正在检查
methodInfo.GetParameters().Count() == 1,委托必须是Action<T1, T2>,因为您需要调用的对象和方法的参数。
标签: c# .net generics reflection lambda