具有委托参数的泛型方法

本文关键字:泛型方法 参数 | 更新日期: 2023-09-27 18:21:17

我正在尝试创建两个泛型方法,其中一个是void,另一个是返回类型。void方法接受一个Action委托,另一个接受Func委托。void方法的实现如下:

 public static void ExecuteVoid<T>(Action<T> actionToExecute)
    {
        string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(T));
        using (ChannelFactory<T> factory = new ChannelFactory<T>(new BasicHttpBinding(), new EndpointAddress(endpointUri)))
        {
            T proxy = factory.CreateChannel();
            actionToExecute(proxy);
        }
    }

这很好,但我对非无效方法有问题:

public static T ExecuteAndReturn<T>(Func<T> delegateToExecute)
    {
        string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(T));
        T valueToReturn;
        using (ChannelFactory<T> factory = new ChannelFactory<T>(new BasicHttpBinding(), new EndpointAddress(endpointUri)))
        {
            T proxy = factory.CreateChannel();
            valueToReturn = delegateToExecute();
        }
        return valueToReturn;
    }

现在,当我尝试调用这样的方法时:

var result = ServiceFactory.ExecuteAndReturn((IMyService x) => x.Foo());

我得到这个编译错误:

The type arguments for method 'ServiceFactory.ExecuteAndReturn<T>(System.Func<T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.

在这种情况下,Foo()是一个没有参数的方法,它返回一个object。然后,我试图通过显式指定类型来调用该方法:

var result = ServiceFactory.ExecuteAndReturn<IMyService>(x => x.Foo());

但现在我得到了另一个例外,说

Delegate 'IMyService' does not take 1 arguments.

我在这里真的迷路了。感谢您的帮助。

具有委托参数的泛型方法

您可能会混淆返回类型和代理类型。如果将参数指定为Func<T>,则T需要是函数的返回类型,而不是代理类型。但是,您还需要指定代理类型,以便获得正确的服务端点和通道工厂。因此,您实际上需要两个类型参数:一个用于代理,一个用于返回类型。我还假设函数委托需要将初始化的代理作为参数;否则,这个包装器方法将毫无意义。

public static TResult ExecuteAndReturn<TProxy, TResult>(
    Func<TProxy, TResult> delegateToExecute)
{
    string endpointUri = ServiceEndpoints.GetServiceEndpoint(typeof(TProxy));
    TResult valueToReturn;
    using (ChannelFactory<TProxy> factory = new ChannelFactory<TProxy>(new BasicHttpBinding(), new EndpointAddress(endpointUri)))
    {
        TProxy proxy = factory.CreateChannel();
        valueToReturn = delegateToExecute(proxy);
    }
    return valueToReturn;
}

编辑:由于(IMyService x) => x.Foo()Func<T>委托不兼容,因此出现编译器错误。编写匿名函数时,推断的类型是匿名函数本身的类型,而不是它碰巧调用的方法。在这种情况下,匿名函数接受类型为IMyService的单个参数,并返回object(是Foo的返回类型)。因此,此匿名方法的正确委托将是Func<IMyService, object>

您已将您的参数定义为func<x>,即没有参数的委托,但随后将其调用为Func<x,y>,即接受1个参数IMyService的委托,因此出现错误"delegate‘IMyService’not take 1 arguments"