簡體   English   中英

具有委托參數的泛型方法

[英]Generic methods with delegate parameters

我正在嘗試創建兩個通用方法,其中一個是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'不接受1個參數“

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM