我的目标通过以下代码进行演示:
void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate
{
aMethod.Invoke(aParams);
}
我怎么能做这种事?
答案 0 :(得分:2)
您可以使用Unconstrained Melody - 或者捏住允许此项的位。
另一方面,实际上并没有公开Invoke
方法。你想做什么不能做到:
void MyMethod(Delegate aMethod, params object[] aParams)
{
aMethod.DynamicInvoke(aParams);
}
?我的意思是,即使使用通用版本,您也不会真正具有编译时安全性,因为参数可能是错误的类型等。
答案 1 :(得分:1)
我不确定你实际上要完成什么:因为只有编译器或运行时可以从System.Delegate继承,这个泛型有什么意义:
void MyMethod<T>(System.Delegate aMethod, params object[] aParams)
{
aMethod.DynamicInvoke(aParams);
}
现在,如果您尝试使用委托类型约束做一些棘手的事情,可以查看http://code.google.com/p/unconstrained-melody/,它会进行一些重写以允许您这样做。
或者,只使用Action<object[]>
- 或Action<T>
,Action<T1,T2>
等的大量重载。
void MyMethod(Action<object[]> aMethod, params object[] aParams)
{
aMethod(aParams);
}
//or
void MyMethod<T>(Action<T> aMethod, T param)
{
aMethod(param);
}
void MyMethod<T1, T2>(Action<T1, T2> aMethod, T1 param1, T2 param2)
{
aMethod(param1, param2);
}
我真的不喜欢巨大的重载列表,但在某些情况下,它们提供了最佳的库可用性。
答案 2 :(得分:0)
T
必须是类型,但您不需要任何泛型
void MyMethod(Action<object[]> aMethod, params object[] aParams)
{
aMethod(aParams);
}
void Print(params object[] output)
{
foreach (var o in output)
Console.WriteLine(o);
}
这样称呼:
MyMethod(Print, 1, "Hello");