2009-09-02 8 views
4

(コードは一例であることに注意してください)のsomeMethod(()=> x.Something)C#で意味

私は、次の構文を持っているもの:

SomeMethod(() => x.Something) 

を何最初のブラケットを表現の意味ですか?

私はまた、あなたがに渡される引数からプロパティ名を取得することができますどのように興味が。このposssibleですか?

+0

重複:http://stackoverflow.com/questions/630330/what-does-mean-in-c/630344#630344 –

+0

大変申し訳ありませんが重複しています。私はそれが 'SomethMethod(x => x.Something)'とどのように異なるのか不思議です –

答えて

7
:何PARAMATERSを持っていないと同じですx.someproperty

delegate{ 
return x.someproperty; 
} 

の型を返すデリゲート

式の最初の括弧は何を意味しますか?

パラメータを使用しないメソッドのラムダ構文です。それは1つのパラメータを取った場合、それはなるだろう:

SomeMethod(x => x.Something); 

それは、n + 1つの引数を取った場合、それはなるだろう:

SomeMethod((x, y, ...) => x.Something); 

私はまた、あなたが得ることができるどのように好奇心渡された引数のプロパティ名。これは可能ですか?

あなたSomeMethodはい、その後、Expression<Func<T>>を取る場合:

void SomeMethod<T>(Expression<Func<T>> e) { 
    MemberExpression op = (MemberExpression)e.Body; 
    Console.WriteLine(op.Member.Name); 
} 
2

それはlambda expressionです。つまり、無名関数や代理を作成する方法です。

一般的な形式は次のとおりです。

(input parameters) => expression 

あなたは

() => expression 

を持っているなら、あなたは引数を取らないと、式の結果を返す関数を作成しました。

C#はtype inferenceを使用して値のタイプを把握し、lexical closureによってローカル変数( "x"変数など)を取得します。

6

()は、空の引数リストです。引数を取らずにx.Somethingを返す無名関数を定義しています。

編集:それは、後者は引数を必要とし、何かをその引数で呼び出されるという点でx => x.Something異なります。前のバージョンでは、xは関数外のどこかに存在しなければならず、何かが呼び出されたのはxです。後者のバージョンでは、外部xである必要はなく、存在していても、関数の引数に何かが呼び出され、他には何も呼び出されません。

1

()このメソッドは、パラメータを取らないことを意味します。あなたはラムダ式を使用して、通常のイベントハンドラを割り当てた場合 例えば、それは次のようになります。

someButton.Click += (s, e) => DoSomething(); 
2

私は、xがどこかに自分のメソッド内で宣言されていると仮定し、yesの場合、あなたはこのラムダ式を比較することができます

() => x.someproperty 
+0

前者はコンパイルされません。 – Dykam

+0

@Dykam、それはないと言いましたか?そうなる。この例をコンパイルしてみてください:http://cleigomes.net/powersource/Output.aspx?fl=3w1e3djw.she – Cleiton

+0

したがって、戻り値の型を前提としていますか? –

0

をあなたはSystem.Linq.Expressions.Expression<System.Func<object>>の型の引数を持っているのsomeMethodを必要とするプロパティの名前を取得するには。式を調べて、プロパティ名を決定することができます。