我正在尝试创建这样的通用委托:
Func<string, string, IEnumerable<MyPOCO>> del =
WCFServiceInstance.GetLabs(SessionStateService.Var1,SessionStateService.Var2));
但似乎因为GetLabs在WCFServiceInstace中,Func委托只是认为我传递的是IEnumerable而不是
Func<string, string, IEnumerable<MyPOCO>>
这是我试图通过它。
答案 0 :(得分:2)
您的方法还有其他问题。
这两个论点应该始终是SessionStateService.Var1
和SessionStateService.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.Var1
和SessionStateService.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()
。