2010-12-07 116 views
2

我的目标是,以实例阐述用下面的代码:与委托类型泛型方法

void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate 
{ 
    aMethod.Invoke(aParams); 
} 

我如何才能做到这样的事情?

回答

2

您可以使用Unconstrained Melody - 或捏住允许的位。

另一方面,这实际上并不会公开Invoke方法。你想做什么不能做到:

void MyMethod(Delegate aMethod, params object[] aParams) 
{ 
    aMethod.DynamicInvoke(aParams); 
} 

?我的意思是,你实际上并没有编译时的安全性,甚至与通用版本,参数可能是错误的类型等

+0

我希望能以某种方式获得参数类型的安全性。 – Max 2010-12-07 22:14:46

+0

@Max:为什么不直接调用方法呢?我不明白这是真的买你什么。 – 2010-12-07 22:23:31

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"); 
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); 
} 

我真的不喜欢过载的巨大的名单,但在某些情况下,他们提供最好的图书馆可用性。