委托类型的通用方法

时间:2010-12-07 21:45:21

标签: c# generics delegates

我的目标通过以下代码进行演示:

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

我怎么能做这种事?

3 个答案:

答案 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");