通用代理存储和使用

时间:2012-05-02 00:21:53

标签: c# generics delegates

delegate IEnumerable<T> GetFromSQLDelegate<T>(...);
public GetFromSQLDelegate myFunctionToCall;

上面没有编译,因为myFunctionToCall没有指定类型。我正试图“存储”一个通用委托,以便我以后可以调用它作为常规通用函数:

// ... somewhere in another code base ...
return MyObject.myFunctionToCall<string>(...);

C#抱怨因为我没有在委托存储属性上指定具体类型。有没有(好)方法来“存储”能够调用泛型函数而不实现各种具体类型委托方案的委托?

2 个答案:

答案 0 :(得分:4)

您可以将值存储为System.Delegate,将其设为private,并定义将存储的委托投射到相应类型的函数GetDelegate<T>

private Delegate storedDelegate;

public myFunctionToCall<T> GetDelegate<T>() {
    return (myFunctionToCall<T>)storedDelegate;
}

然后你可以这样称呼它:

return MyObject.GetDelegate<string>()(...);

()(...)语法周围有一点点丑陋,但应该可以解决这个问题。

答案 1 :(得分:0)

C#中没有任何拼图:

  • 您不能拥有非指定类型
  • 的泛型类型的非泛型变量
  • 您无法创建与此类虚构签名相匹配的功能
  • 您无法调用函数并指定类型。

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