6
string thing = "etc";
thing = thing.GetName();
//now thing == "thing"

これも可能ですか?

public static string GetName(this object obj)
{
    return ... POOF! //should == "thing"
}
4

4 に答える 4

5

@Reedの答えに同意します。ただし、本当にこの機能を実現したい場合は、次のように機能させることができます。

string thing = "etc";
thing = new{thing}.GetName();

拡張メソッドは、GetName単にリフレクションを使用して、匿名オブジェクトから最初のプロパティの名前を取得します。

他の唯一の方法はラムダ式を使用することですが、コードは間違いなくはるかに複雑になります。

于 2011-12-08T06:29:59.147 に答える
4

いいえ。使用している時点では、「名前」は「obj」になります。これは、MethodBase.GetCurrentMethod()を介して(デバッグシンボルを配置して)取得できます。GetParameters() [0].Name。

ただし、呼び出し元のメソッドから変数名を取得することはできません。

于 2011-12-08T02:43:38.700 に答える
1

拡張メソッド内に元の変数名が必要な場合は、次のようにするのが最善だと思います。

thing.DoSomething(nameof(thing));

public static string DoSomething(this object obj, string name) {
    // name == "thing"
}
于 2017-10-03T12:31:45.030 に答える
-2

C#6の新nameof()機能は、拡張メソッドを完全に置き換えるものです。

if (x == null) throw new ArgumentNullException(nameof(x));
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode”

関数が呼び出されたメソッドCallerMemberAttributeの名前を取得するのは、ある程度関連しています。2つの方法の有用な比較は、イベントに関連する例とともに、生成されたILコードについても説明しています(TL; DR:それらは同じです)。PropertyChanged

于 2016-09-01T11:43:37.167 に答える