2012-12-18 67 views
1

如果我有一个类型,如:如何使用C#中的类型来制作泛型委托?

Type type = myObject.GetType(); 

我如何使用该类型的对象作为参数的泛型委托?我希望代码类似于:

myDelegate = Action<type> (type parameter); 

上述代码显然不会和不工作,但我怎么能使它工作?我甚至可以使它工作?

最终,我的字典<类型,列表<行动字典<>>,其保持类型和应采取该类型作为参数的一个目的委托列表。

而且应该执行这样的事情:

myDict[myType][i] (objectOfMyType); 

任何建议,将不胜感激。

谢谢!

+3

泛型不应该需要知道什么类型的他们正在合作。这是什么使他们*通用*。 – Yuck

+0

也许这可以帮助:http://stackoverflow.com/questions/773099/generating-delegate-types-dynamically-in-c-sharp – JGaarsdal

+0

一个现实世界的例子将有所帮助 – Alex

回答

1

正如您所料,您不能直接在字典中使用Action<>类型的实例。你必须将它键入System.Delegate,并使用DynamicInvoke

Dictionary<Type, List<Delegate>> dict; 

dict[myType][i].DynamicInvoke(objectOfMyType); 

,并在第一时间创建了代表,利用反射:

Type delegateType = typeof(Action<>).MakeGenericType(myType); 

MethodInfo delegatedMethod = typeof(ContainingType).GetMethod("MethodToInvoke"); 

Delegate myDelegate = Delegate.CreateDelegate(delegateType, delegatedMethod); 
dict.Add(myType, new List<Delegate> {myDelegate}); 
+0

谢谢,这工作得很好!我只使用了最上面的代码块,这让我走上了正确的道路,再见了样板模型! – Wahooney