2013-03-11 76 views
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; 

我该如何做到这一点?感谢您的时间!

+2

http://stackoverflow.com/questions/4657311/reflection-get-property-name – SpaceBison 2013-03-11 07:29:32

+0

也许你想要的是_ [从getter/setter的'MethodInfo'中找到托管'PropertyInfo'](http://stackoverflow.com/questions/520138/)_? – 2013-03-11 09:47:36

+0

我不认为这是可能的。 “LocaleValues”的一个实例如何知道它是通过一个名为'Name'的属性“找到”的?你可能每次都返回'get_Method'的代码?也许你应该让你的'Name' setter修改它所需的参数('value')来记录名字? – 2013-03-11 09:54:13

回答

9

如果你真正的意思是当前财产(问题的标题):

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" 
+0

也许我不明白的东西....或在我的问题中发布了错误,但我怎么能用它来知道'LocaleValues'内我的属性的确切名称?我需要这样做,当我调用'News.Name.Method'时,'LocalValues'知道它被命名为'Name',当我调用'News.Body.Method'时,它比callea为'Body',与具有类型的属性的其他类完全一样的东西'LocalValues' ......我真的为我的英语不好:( – CodeDemen 2013-03-11 09:15:59

+0

对不起这是MVVM在WPF说'NotifyPropertyChanged特别有用的,而不是( “Foo”)'你可以使用这个属性并且只是说'NotifyPropertyChanged()'。 – 2016-07-03 23:21:11