如何从对象内的方法创建泛型委托

时间:2013-12-05 10:30:42

标签: c# delegates func

我正在尝试创建这样的通用委托:

Func<string, string, IEnumerable<MyPOCO>> del  = 
WCFServiceInstance.GetLabs(SessionStateService.Var1,SessionStateService.Var2));

但似乎因为GetLabs在WCFServiceInstace中,Func委托只是认为我传递的是IEnumerable而不是

Func<string, string, IEnumerable<MyPOCO>> 

这是我试图通过它。

4 个答案:

答案 0 :(得分:2)

您的方法还有其他问题。 这两个论点应该始终是SessionStateService.Var1SessionStateService.Var2吗?或者那些是代表的论点?

如果您希望它们成为委托的参数:

Func<string, string, IEnumerable<MyPOCO>> del  =
   WCFServiceInstance.GetLabs;

del(SessionStateService.Var1, SessionStateService.Var2);

如果希望使用这些特定值调用该方法,请改为使用闭包:

Func<IEnumerable<MyPOCO>> del  =
   () => WCFServiceInstance.GetLabs(SessionStateService.Var1, SessionStateService.Var2);

del();

请记住,如果使用闭包,则在调用委托时(第2行)将评估SessionStateService.Var1SessionStateService.Var2,而不是在声明委托时(第1行)。因此,如果您传递此第二个委托并稍后调用它,则参数的值可能已更改。

如果你想阻止它,你可以使用急切评估,如评论中的@ knittl所示:

string var1 = SessionStateService.Var1,
       var2 = SessionStateService.Var2;

Func<IEnumerable<MyPOCO>> del = () => WCFServiceInstance.GetLabs(var1, var2);

答案 1 :(得分:1)

Func<string, string, IEnumerable<MyPOCO>> del = WCFServiceInstance.GetLabs;

然后像:

一样使用它
del(SessionStateService.Var1,SessionStateService.Var2);

答案 2 :(得分:0)

我想你想要:

Func<string, string, IEnumerable<MyPOCO>> del = WCFServiceInstance.GetLabs;

也就是说,假设WCFServiceInstance.GetLabs具有以下签名:

IEnumerable<MyPOCO> WCFServiceInstance.GetLabs(string, string)

答案 3 :(得分:0)

我认为你想要一个lambda表达式来部分应用这个函数,修复前两个参数:

Func<IEnumerable<MyPOCO>> del  =
  () => WCFServiceInstance.GetLabs(
    SessionStateService.Var1,
    SessionStateService.Var2);

请致电del()