This question already has answers here:
Reflection - get property name [duplicate]

(2 个回答)


8年前关闭。




我有一个类
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;

我怎样才能做到这一点?感谢您的时间!

最佳答案

如果您真的是指当前的属性(property)(问题标题):

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

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

这将工作推送到编译器而不是运行时,并且不管内联、混淆等如何工作。请注意,这需要 using 、C#5 和 .NET 4.5 或类似的 using System.Runtime.CompilerServices; 指令。

如果你的意思是这个例子:
var propName = new News().Name.Method;

那么直接从该语法中是不可能的; .Name.Method() 会在 .Name 的结果上调用一些东西(可能是一个扩展方法)——但这只是一个.n.other 对象,不知道它来自哪里(例如 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;
}

IE。
Expression<Func<object>> expr = () => new News().Bar;
var name = GetMemberName(expr); // "Bar"

关于c# - 如何获取当前属性的名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15333249/

10-17 02:09