2011-01-24 9 views
5

私は次のように書こうとしています。このメソッドBのパラメータとして、別のメソッド "B"と未知数のパラメータをとるメソッド "A"を書きたいと思います。 (params object [] args)です。さて、メソッドAの中で、パラメータargsを使ってBを呼び出したいと思います。 BはAを返すようにしたいオブジェクトを返します。C#与えられたメソッドを実行するメソッド

このすべては少し奇妙に聞こえるので、私はいくつかのサンプルコードを追加します。

public object A(Func<object> B, params object[] args) 
{ 
    object x = B.Method.Invoke(args); 

    return x; 
} 

問題はfuncがそのように動作しないこと、です。誰もがこれを行う方法を知っていますか?

よろしく、

+0

あなたは、整数と文字列を受け入れることのFuncを定義する場合は、例えば一部だけ定義されたパラメータを渡す場合は、コードの仕事をしていますか?私はあなたのコードはほぼOKですが、もしFuncがparamsを受け入れるように定義されているかどうかはわかりません。 –

+0

パラメータを定義するとうまくいきます。しかし、それはFunc Bのようなものを受け入れません。 – Christian

+1

bは固定の署名ですか? B型が何を返すのか知っていますか?そうでなければ、Func <..>署名を使用することはできません。デリゲートと動的な呼び出しを使用する必要があります。 http://msdn.microsoft.com/en-us/library/system.delegate.dynamicinvoke.aspx – davidfowl

答えて

3
void Main() 
{ 
    Func<int> m1=()=>1; 
    Console.WriteLine(A(m1)); 

    Func<int,int> m2=i=>i; 
    Console.WriteLine(A(m2,55)); 
} 

object A(Delegate B,params object[] args) 
{ 

    return B.Method.Invoke(B.Target,args); 
} 

...さよならの型の安全性

+0

これは仕事をします。ありがとうございました!まあ、あなたが正しい、タイプセーフティは行っているが、私の場合は、それを行う他の方法はありません。 – Christian

1

クリスチャンこれはそれを行う必要があります。

public object A(Func<object[], object> B, params object[] args) 
{  
    object x = B(args);  
    return x; 
} 
+0

これは、私のすべてのBがオブジェクト配列を引数として取る場合に機能します。私はこれを使うことができましたが、B関数がそのまま残っている方が良いでしょう。 – Christian

3

Func<object>が引数をとらないとobjectを返すメソッドのデリゲートです。あなたはFunc<object,object>に変更した場合、それは引数を取り、返されたオブジェクト:

public object A(Func<object[], object> B, params object[] args) 
{ 
    object x = B(args); 

    return x; 
} 

あなたがたFunc過負荷が受諾する必要があることを逃している:あなたはこのようなコードを持っている必要があり

public object A(Func<object, object> B, params object[] args) 
{ 
    object x = B(args); 

    return x; 
} 
+0

問題は、Bが1つ以上の引数を取ることができることです。 – Christian

+0

@Christian:配列も 'object'なので、あなたは' Func 'にほとんど何でも渡すことができます。次に、実際に何が得られたかを調べるのは、呼び出されたメソッドに依存します。したがって、 'params object [] args'を使って' args'を 'Func 'に渡すことができます。 –

+0

ああそうだよ!あなたは正しい、それは動作します。ありがとう! – Christian

1

あなたのオブジェクトの引数の配列。

とにかく、このメソッド "A"が無パラメータ関数を受け入れる必要がある場合は、 "A"のparemeterless関数パラメータオーバーロードを作成する必要があります。

関連する問題