我的目标是,以实例阐述用下面的代码:与委托类型泛型方法
void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate
{
aMethod.Invoke(aParams);
}
我如何才能做到这样的事情?
我的目标是,以实例阐述用下面的代码:与委托类型泛型方法
void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate
{
aMethod.Invoke(aParams);
}
我如何才能做到这样的事情?
您可以使用Unconstrained Melody - 或捏住允许的位。
另一方面,这实际上并不会公开Invoke
方法。你想做什么不能做到:
void MyMethod(Delegate aMethod, params object[] aParams)
{
aMethod.DynamicInvoke(aParams);
}
?我的意思是,你实际上并没有编译时的安全性,甚至与通用版本,参数可能是错误的类型等
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");
我不知道你实际上要完成的:因为只有编译器或运行时可以从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);
}
我真的不喜欢过载的巨大的名单,但在某些情况下,他们提供最好的图书馆可用性。
我希望能以某种方式获得参数类型的安全性。 – Max 2010-12-07 22:14:46
@Max:为什么不直接调用方法呢?我不明白这是真的买你什么。 – 2010-12-07 22:23:31