通用委托存储和使用
本文关键字:存储 | 更新日期: 2023-09-27 18:32:47
delegate IEnumerable<T> GetFromSQLDelegate<T>(...);
public GetFromSQLDelegate myFunctionToCall;
上面没有编译,因为myFunctionToCall没有指定类型。我正在尝试"存储"一个通用委托,以便以后可以将其作为常规泛型函数调用:
// ... somewhere in another code base ...
return MyObject.myFunctionToCall<string>(...);
C# 抱怨,因为我没有在委托存储属性上指定具体类型。有没有一种(好的)方法来"存储"能够在不实现各种具体类型委托方案的情况下调用泛型函数的委托?
您可以将值存储为 System.Delegate
,使其private
,并定义一个函数GetDelegate<T>
将存储的委托转换为适当的类型:
private Delegate storedDelegate;
public myFunctionToCall<T> GetDelegate<T>() {
return (myFunctionToCall<T>)storedDelegate;
}
然后你可以像这样称呼它:
return MyObject.GetDelegate<string>()(...);
围绕()(...)
语法有一些丑陋的地方,但它可能应该可以解决问题。
在 C# 中没有拼图:
- 不能将泛型类型的非泛型变量与非指定类型一起使用
- 您无法创建与此类虚构签名匹配的函数
- 不能调用函数并指定类型。
所以答案是否定的。有多种不同的方法可以实现类似的行为,所以如果你指定你的实际目标是什么,有人会想出一种方法。