【问题标题】:How to get name of current property [duplicate]如何获取当前属性的名称[重复]
【发布时间】:2013-03-11 07:25:48
【问题描述】:

我有课

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;

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

【问题讨论】:

标签: c# system.reflection


【解决方案1】:

如果你真的指的是 current 属性(问题标题):

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

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

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

如果你指的是例子:

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"

【讨论】:

  • 也许我不明白什么......或者在我的问题中发布了一些错误,但我怎么能用它来知道我在LocaleValues 中的属性的确切名称?我需要这样做,当我调用 News.Name.Method 时,LocalValues 知道它被命名为 Name,而当我调用 News.Body.Method 时,它是 callea 作为 Body,确切与具有LocalValues 类型属性的其他类相同...我真的很抱歉我的英语不好:(
  • 这对于 WPF 中的 MVVM 特别有用,因为您可以使用此属性并直接说 NotifyPropertyChanged(),而不是说 NotifyPropertyChanged("Foo")
猜你喜欢
  • 2010-10-29
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-21
  • 2013-09-11
相关资源
最近更新 更多