string thing = "etc";
thing = thing.GetName();
//now thing == "thing"
これも可能ですか?
public static string GetName(this object obj)
{
return ... POOF! //should == "thing"
}
string thing = "etc";
thing = thing.GetName();
//now thing == "thing"
これも可能ですか?
public static string GetName(this object obj)
{
return ... POOF! //should == "thing"
}
@Reedの答えに同意します。ただし、本当にこの機能を実現したい場合は、次のように機能させることができます。
string thing = "etc";
thing = new{thing}.GetName();
拡張メソッドは、GetName
単にリフレクションを使用して、匿名オブジェクトから最初のプロパティの名前を取得します。
他の唯一の方法はラムダ式を使用することですが、コードは間違いなくはるかに複雑になります。
いいえ。使用している時点では、「名前」は「obj」になります。これは、MethodBase.GetCurrentMethod()を介して(デバッグシンボルを配置して)取得できます。GetParameters() [0].Name。
ただし、呼び出し元のメソッドから変数名を取得することはできません。
拡張メソッド内に元の変数名が必要な場合は、次のようにするのが最善だと思います。
thing.DoSomething(nameof(thing));
public static string DoSomething(this object obj, string name) {
// name == "thing"
}
C#6の新nameof()
機能は、拡張メソッドを完全に置き換えるものです。
if (x == null) throw new ArgumentNullException(nameof(x)); WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode”
関数が呼び出されたメソッドCallerMemberAttribute
の名前を取得するのは、ある程度関連しています。2つの方法の有用な比較は、イベントに関連する例とともに、生成されたILコードについても説明しています(TL; DR:それらは同じです)。PropertyChanged