C#委托可以使用对象类型更通用吗?

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中创建一个非常可重用的委托?

em7*_*m70 7

我建议你将代码更改为:


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)

这样你可以避免所有丑陋的向下转换:)


Jon*_*eet 5

我建议你使用通用委托,例如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)