2011-07-03 9 views
22

C#のメソッドはメソッドを返すことはできますか?C#メソッドがメソッドを返すことはできますか?

メソッドはlambda expressionを返すことができますが、メソッドがTypeではないため、そのようなメソッドにどのような型パラメータを与えることができるのかわかりません。そのような返されたメソッドは、一部の代理人に割り当てることができます。

は、一例として、この概念を考えてみましょう:

public <unknown type> QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

delegate float Function(float x); 
Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f); 
+1

既に*必要なデリゲートタイプが宣言されています。ここであなたの質問は何ですか? –

答えて

31

お探しのタイプはAction<>またはFunc<>です。

両方の型の汎用パラメータによって、メソッドの型シグネチャが決まります。メソッドに戻り値がない場合はActionを使用してください。戻り値がある場合はFuncを使用し、最後の汎用パラメータが戻り値の型です。例えば

public void DoSomething()       // Action 
public void DoSomething(int number)    // Action<int> 
public void DoSomething(int number, string text) // Action<int,string> 

public int DoSomething()       // Func<int> 
public int DoSomething(float number)    // Func<float,int> 
public int DoSomething(float number, string text) // Func<float,string,int> 
0

あなたのラムダ式は、(私は信じている)パラメータとしてfloatを取り、その後、同様floatを返します。 .NETでは、タイプFunc<float, float>で表すことができます。

通常、より多くのパラメータを使用するラムダを扱う場合、最大8つのパラメータを使用してFunc<Type1, Type2, Type3, ..., ReturnType>を使用できます。

15
public Func<float, float> QuadraticFunctionMake(float a, float b, float c) { 
    return x => a * x * x + b * x + c; 
} 

戻り型がFunc<float, float>あります。

-1

キーワードはdynamicです。 dynamic (C# Reference)を参照してください。

+5

これは最悪の可能な選択肢です。 –

+0

動的キーです。コンパイル時の型チェックをスキップするだけで、このキーワードを使用すると解決策ではなくハックになります – RaM

+0

静的型のソリューションではありませんが、それはうまくいくはずです。 "ハック。" – Paul

0

あなたはアクション< T>デリゲート定義が必要だと思います。私は記事Action<T> Delegateあなたに役立つことを願っています。

2

<unknown type> = Function。それは

public Function QuadraticFunctionMaker(float a , float b , float c) 
{ 
    return (x) => { return a * x * x + b * x + c; }; 
} 

はあなたが既に一致するデリゲートFunctionを宣言したので、探しているものです、です。また、デリゲートを宣言する必要はありません。Func<float, Float>を他の人に気付かれるように使用することもできます。これは全く同じです。実際には、Func<T, T>は、代理人Functionとまったく同じ方法で宣言されています。

+0

'Func <>'や 'Action <>'のようなものを使うのが良いでしょう。私は、MSがカスタム代議員を全部持っているから離れていると思う。 – siride

+0

これは唯一の良い答えです。私は他のすべての答えを投票するでしょう... – Jeff

+0

@サイード:いいえそうではありません。あなたの意図を明示的にしたい場合は、強く定義されたデリゲートが良いです。 – Jeff

-3

あなたの状況では、タプルが適切だと思います。詳細については、こちらをご覧くださいhttp://sankarsan.wordpress.com/2009/11/29/tuple-in-c-4-0/

+2

タプルはこれと何が関係していますか?彼はペアやトリプルのデータを返さず、単一の値を返します。 – siride

関連する問題