分配给Delegate的通用方法

100*_*101 12 c# generics delegates types interface

我对代表和通用方法感到有些困惑.

是否可以将委托分配给具有泛型类型参数的方法?

IE:

//This doesn't allow me to pass a generic parameter with the delegate.
public delegate void GenericDelegate<T>() 

someDelegate = GenericMethod;
public void GenericMethod<T>() where T : ISomeClass
{

}
Run Code Online (Sandbox Code Playgroud)

我正在尝试将此委托传递给函数,该函数具有该方法所期望的接口的泛型类型,具有如下函数:

void CheckDelegate(GenericDelegate<ISomeClass> mechanism);
Run Code Online (Sandbox Code Playgroud)

所以我可以像这样使用委托:

someDelegate<ImplementsSomeClass>();
Run Code Online (Sandbox Code Playgroud)

usr*_*usr 10

您的问题没有意义,因为您不能使用开放的泛型类型来声明存储位置(如本地变量或字段).它必须始终关闭.

我知道你想传递GenericDelegate<T>给一个采用这样一个值作为参数的方法.但即使这样,委托类型也会T以泛型类型参数关闭.

在您编写的示例代码中

someDelegate = GenericMethod;
Run Code Online (Sandbox Code Playgroud)

但是someDelegate应该有什么类型?它必须显然是close(GenericDelegate<string>)或用外部作用域中的泛型类型参数关闭:

void SomeOuterMethod<T>() where T : ISomeClass {
    GenericDelegate<T> someDelegate = GenericMethod<T>;
}
Run Code Online (Sandbox Code Playgroud)

我希望我理解你的问题.如果没有,请澄清.如果你详细说明你想要完成什么,我会尝试提出一个实用的解决方案.

像Haskell这样的其他语言确实支持传递开放泛型类型的值(换句话说,你可以有一个类型的变量IEnumerable<>).这是实现monad所必需的.CLR没有该功能.


新思路:您可以使用可以覆盖的泛型方法创建非泛型基类型而不是委托:

interface CheckHandler {
 public void Check<T>(T someArg);
}
Run Code Online (Sandbox Code Playgroud)

希望涵盖您的方案.你无法自由传递任何东西CheckHandler.Check然后可以使用任意类型参数调用其方法.