3

私はクラスを持っています

public class News : Record
{
    public News()
    {
    }

    public LocaleValues Name { get; set; }
    public LocaleValues Body;
}

そして私のLocaleValuesクラスでは:

public class LocaleValues : List<LocalizedText>
{
    public string Method
    {
        get
        {
            var res = System.Reflection.MethodBase.GetCurrentMethod().Name;
            return res;
        }
    }
}

次のような呼び出しを行うときに、プロパティ名Methodの文字列表現を返すプロパティが必要です。Name

var propName = new News().Name.Method;

どうすればこれを達成できますか?お時間をいただきありがとうございます!

4

1 に答える 1

10

本当に現在のプロパティを意味する場合(質問のタイトル):

public static string GetCallerName([CallerMemberName] string name = null) {
    return name;
}
...

public string Foo {
    get {
        ...
        var myName = GetCallerName(); // "Foo"
        ...
    }
    set { ... }
}

これにより、作業がランタイムではなくコンパイラにプッシュされ、インライン化や難読化などに関係なく機能します。これには、C# 5、および .NET 4.5 などのusingディレクティブが必要であることに注意してください。using System.Runtime.CompilerServices;

例を意味する場合:

var propName = new News().Name.Method;

その構文から直接行うことはできません。.Name.Method()-の結果に対して何か (おそらく拡張メソッド) を呼び出します.Nameが、それは単なる別のオブジェクトであり、それがどこから来たのか (Nameプロパティなど) を知りません。理想的にはName、式ツリーを取得するのが最も簡単な方法です。

Expression<Func<object>> expr = () => new News().Bar;

var name = ((MemberExpression)expr.Body).Member.Name; // "Bar"

次のようにカプセル化できます。

public static string GetMemberName(LambdaExpression lambda)
{
    var member = lambda.Body as MemberExpression;
    if (member == null) throw new NotSupportedException(
          "The final part of the lambda is not a member-expression");
    return member.Member.Name;
}

すなわち

Expression<Func<object>> expr = () => new News().Bar;
var name = GetMemberName(expr); // "Bar"
于 2013-03-11T07:32:53.993 に答える