我对委托和通用方法感到有些困惑。
是否可以将委托分配给具有泛型类型参数的方法?
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
{
}
我正在尝试使用该方法所期望的接口的通用类型将此委托传递给函数,并具有如下功能:
void CheckDelegate(GenericDelegate<ISomeClass> mechanism);
这样我就可以像这样使用委托:
someDelegate<ImplementsSomeClass>();
您的问题毫无意义,因为您永远无法使用开放的泛型类型来声明存储位置(例如局部变量或字段)。它必须始终关闭。
我了解您想将a传递GenericDelegate<T>
给以这样的值作为参数的方法。但是即使那样,委托类型也将T
作为通用类型参数而关闭。
在示例代码中,您编写
someDelegate = GenericMethod;
但是someDelegate
应该有什么类型的呢?它必须是明显关闭的(GenericDelegate<string>
)或用外部作用域的通用类型参数关闭:
void SomeOuterMethod<T>() where T : ISomeClass {
GenericDelegate<T> someDelegate = GenericMethod<T>;
}
希望我能理解您的问题。如果没有,请澄清。如果您详细说明了要完成的工作,那么我将尝试提出一个实用的解决方案。
其他语言(例如Haskell)也支持传递开放的泛型类型的值(换句话说,您可以具有type的变量IEnumerable<>
)。这是实现monad所必需的。CLR没有该功能。
新思路:可以使用可重写的泛型方法创建非泛型基本类型,而不是委托:
interface CheckHandler {
public void Check<T>(T someArg);
}
希望能涵盖您的情况。您不能随意传递任何信息CheckHandler
。Check
然后可以使用任意类型的参数调用其方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句