2013-03-11 6 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

+0

Может быть, что вам want is _ [Поиск хостинга 'PropertyInfo' из' MethodInfo' getter/setter] (http://stackoverflow.com/questions/520138/) _? –

+0

Я не думаю, что это возможно. Как экземпляр «LocaleValues» знает, что он был «найден» через свойство под названием «Имя»? Код, который вы, вероятно, каждый раз возвращает 'get_Method'? Может быть, вы должны сделать свой установщик «Name» модифицировать параметр, который он принимает ('значение'), чтобы записать имя? –

ответ

9

Если вы действительно имеете в виду тока свойства (название вопроса):

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

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

это толкает работу в компилятор, а не во время выполнения, и работает независимо от встраивание, запутывания и т.д. Обратите внимание, это потребности a using директива от using System.Runtime.CompilerServices;, C# 5 и .NET 4.5 или аналогичных.

Если вы имеете в виду пример:

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

, то это не представляется возможным непосредственно из этого синтаксиса; .Name.Method() будет ссылаться на что-то (возможно, метод расширения) на результат .Name - но это просто объект a.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; 
} 

т.е.

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

+0

Это особенно полезно для MVVM в WPF, вместо того, чтобы говорить« NotifyPropertyChanged (NotifyPropertyChanged) «Foo») 'вы можете использовать этот атрибут и просто сказать« NotifyPropertyChanged() ». –

Смежные вопросы