2

2 つのジェネリック メソッドを作成しようとしています。そのうちの 1 つは void で、もう 1 つは戻り値の型です。void メソッドはActionデリゲートを受け取り、もう 1 つのメソッドはデリゲートを受け取り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);
        }
    }

これは問題なく動作しますが、非 void メソッドに問題があります。

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.

私はここで本当に迷っています。どんな助けでも大歓迎です。

4

2 に答える 2

6

戻り値の型とプロキシ型を混同している可能性があります。引数を として指定する場合はFunc<T>Tプロキシ タイプではなく、関数の戻り値のタイプである必要があります。ただし、適切なサービス エンドポイントとチャネル ファクトリを取得するには、プロキシ タイプも指定する必要があります。したがって、実際には2 つの型パラメーターが必要です。1 つはプロキシ用で、もう 1 つは戻り型用です。また、関数デリゲートは初期化されたプロキシをパラメーターとして受け取る必要があると想定しています。そうしないと、このラッパー メソッドは無意味になります。

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>匿名関数を記述する場合、推論される型は匿名関数自体の型であり、たまたま呼び出したメソッドではありません。この場合、無名関数は type の 1 つのパラメーターを受け取り、( の戻り値の型である)IMyServiceを返します。したがって、この匿名メソッドの正しいデリゲートは になります。objectFooFunc<IMyService, object>

于 2013-07-04T21:53:04.327 に答える
0

func<x>引数をパラメーターなしのデリゲートとして定義しましたがFunc<x,y>、それを 1 つのパラメーター IMyService を受け取るデリゲートとして呼び出すため、「デリゲート 'IMyService' は引数を 1 つ取りません」というエラーが発生します。

于 2013-07-04T22:05:11.147 に答える