通用委托存储和使用

本文关键字:存储 | 更新日期: 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# 中没有拼图:

  • 不能将泛型类型的非泛型变量与非指定类型一起使用
  • 您无法创建与此类虚构签名匹配的函数
  • 不能调用函数并指定类型。

所以答案是否定的。有多种不同的方法可以实现类似的行为,所以如果你指定你的实际目标是什么,有人会想出一种方法。