-1

関数デリゲートを使用して、パラメータを持つメソッドを呼び出す方法を探しています。

processOperationB を呼び出す代わりに、代わりに関数デリゲートを使用できます。しかし、以下の方法を達成できる方法を探しています。

public class Client
{

    public AOutput OperationA (string param1, string param2)
    {
    //Some Operation 
    }

    public BOutput  OperationB(string param1, string param2)
    {
        //Some Operation 
    }
}


public class Manager 
{
    private Client cl;



    public Manager()
    {
        cl=new Client();
    }


    private void processOperationA(string param1, string param2)
    {

        var res = cl.OperationA(param1,param2); 
        //...   

    }

    private void processOperationB(string param1, string param2)
    {
        var res = cl.OperationB(param1,param2); 

        // trying to Call using the GetData , in that case I could get rid of individual menthods for processOperationA, processOperationB

        var res= GetData<BOutput>( x=> x.OperationB(param1,param2));
    }


    // It could have been done using Action, but it should return a value 
    private T GetData<T>(Func<Client,T> delegateMethod)
    {

    // how a Function delegate with params can be invoked 
    // Compiler expects the arguments to be passed here. But have already passed all params .

        delegateMethod();


    }

}
4

1 に答える 1

2

あなたのコメントは次のとおりです。

コンパイラは、引数がここに渡されることを期待しています

しかし、それは本当ではありません。はい、それは引数を期待していますが、期待しているとは限りません。

パラメータdelegateMethodは ですFunc<Client, T>。つまり、 type の単一の引数が必要であり、 typeClientの値を返しますT。あなたが示したコードに基づいて、代わりにこれを書くべきです:

private T GetData<T>(Func<Client,T> delegateMethod)
{
    return delegateMethod(cl);
}

あなたが解決しようとしているより広い問題が何であるかは私には明らかではありません。GetData<T>()メソッドがここに何も追加していません。呼び出し元は、それぞれの場合に適切な「操作...」メソッドを呼び出すだけでよいと思います(つまり、processOperationA()メソッドのように)。

しかし、少なくともコンパイラ エラーは解決できます。その広範な問題についてサポートが必要な場合は、新しい質問を投稿できます。実行しようとしていることを明確に示し、何を試して何がうまくいかないかを正確に説明する、最小限で、検証可能で、完全な優れたコード例を含めるようにしてください。

于 2016-11-05T02:21:33.690 に答える