C# 具有委托类型的泛型方法

C# 具有委托类型的泛型方法,c#,generics,delegates,C#,Generics,Delegates,我的目标用以下代码演示: void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate { aMethod.Invoke(aParams); } void MyMethod(T aMethod,params object[]aParams),其中T:System.Delegate { 方法调用(aParams); } 我怎样才能做到这一点呢?你可以使用或捏一下允许这样做的钻头 另

我的目标用以下代码演示:

void MyMethod<T>(T aMethod, params object[] aParams) where T: System.Delegate
{
    aMethod.Invoke(aParams);
}
void MyMethod(T aMethod,params object[]aParams),其中T:System.Delegate
{
方法调用(aParams);
}
我怎样才能做到这一点呢?

你可以使用或捏一下允许这样做的钻头

另一方面,这实际上不会公开
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);
}

我不确定您实际想要完成什么:因为只有编译器或运行时可以从System.Delegate继承,所以泛型有什么意义:

void MyMethod<T>(System.Delegate aMethod, params object[] aParams) 
{
  aMethod.DynamicInvoke(aParams);
}
void MyMethod(System.Delegate方法,params对象[]aParams)
{
动态法(aParams);
}
现在,如果您试图对委托类型约束做一些棘手的事情,您可以看看,它会执行一些il重写来允许您这样做

或者,只需使用一个
操作
——或者对
操作
操作
等使用大量重载

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);
} 
void MyMethod(操作方法,参数对象[]aParams)
{
阿莫德(aParams);
} 
//或
无效方法(作用方法,T参数)
{
阿莫德(param);
} 
无效方法(作用方法,T1参数1,T2参数2)
{
aMethod(param1,param2);
} 

我真的不喜欢重载的庞大列表,但在某些情况下,它们提供了最佳的库可用性。

这不适用于没有参数的委托(MethodInvoker)。我希望以某种方式获得参数类型的安全性。@Max:为什么不直接调用该方法呢?我不明白这到底给你买了什么。我想提取常见的异常处理代码。尝试{invoke}catch(1){}catch(2){}…一种通用约束可能有用的情况是编写一个类型安全的委托,该委托结合了
委托的扩展方法版本。组合
委托。删除
(给定
动作Act1
动作Act2
,如果
动作1.Plus(Act2)就好了
可能产生一个包含两个代理的
操作
(如果需要,转换第二个代理)。如果没有Intellisense在任意类对象上提供
Plus
方法,我想不出一种方法可以让该方法知道
Act1
的编译时类型。@supercat:是的,我认为无约束Melody可以做到这一点。。。
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);
}