Bre*_*ker 2 c# delegates functional-programming type-conversion
我想创建一个委托和一个方法,可以用来调用我的应用程序所需的任意数量的Web服务:
例:
public DateCheckResponseGetDate(DateCheckRequest requestParameters)
{
delegate object WebMethodToCall(object methodObject);
WebMethodToCall getTheDate = new WebMethodToCall(WebServices.GetTheDate);
return (DateCheckResponse)CallWebMethod(getTheDate , requestParameters);
}
public TimeCheckResponse GetTime(TimeCheckRequest requestParameters)
{
delegate object WebMethodToCall(object methodObject);
WebMethodToCall getTheTime = new WebMethodToCall(WebServices.GetTheTime);
return (TimeCheckResponse)CallWebMethod(getTheTime, requestParameters);
}
private object CallWebMethod(WebMethodToCall method, object methodObject)
{
return method(methodObject);
}
Run Code Online (Sandbox Code Playgroud)
但是,不幸的是,当我尝试编译时,我得到了这些错误:
"GetTheDate"没有重载匹配委托"WebMethodToCall"'GetTheTime'没有重载匹配委托'WebMethodToCall'
似乎代表应该工作.
WebServices.GetTheDate和WebServices.GetTheTime都采用单个参数(分别为DateCheckRequest和TimeCheckRequest)并且都返回一个值.
那么委托不匹配两个Web方法的签名吗?(接受和返回从对象派生的类型).
是否可以使用对象类型在.NET 2.0中创建一个非常可重用的委托?
我建议你将代码更改为:
public DateCheckResponseGetDate(DateCheckRequest requestParameters)
{
Func<DateCheckRequest, DateCheckResponse> getTheDate = new Func<DateCheckRequest, DateCheckResponse>(WebServices.GetTheDate);
return CallWebMethod(getTheDate , requestParameters);
}
//DEFINE CallWebMethod ADEQUATELY!
public T CallWebMethod<T,U> (Func<T,U> webMethod, U arg)
{
return webMethod(arg);
}
Run Code Online (Sandbox Code Playgroud)
这样你可以避免所有丑陋的向下转换:)
我建议你使用通用委托,例如Func<T, TResult>:
public DateCheckResponseGetDate(DateCheckRequest requestParameters)
{
// Split declaration/assignment just to avoid wrapping
Func<DateCheckRequest, DateCheckResponse> method;
method = WebServices.GetTheDate;
return CallWebMethod(method, requestParameters);
}
Run Code Online (Sandbox Code Playgroud)
你CallWebMethod也可以制作通用的:
public TResponse CallWebMethod<TRequest, TResponse>
(Func<TRequest, TResponse> method, TRequest request)
{
// Whatever you do in here.
}
Run Code Online (Sandbox Code Playgroud)