Если вы действительно имеете в виду тока свойства (название вопроса):
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"
http://stackoverflow.com/questions/4657311/reflection-get-property-name – SpaceBison
Может быть, что вам want is _ [Поиск хостинга 'PropertyInfo' из' MethodInfo' getter/setter] (http://stackoverflow.com/questions/520138/) _? –
Я не думаю, что это возможно. Как экземпляр «LocaleValues» знает, что он был «найден» через свойство под названием «Имя»? Код, который вы, вероятно, каждый раз возвращает 'get_Method'? Может быть, вы должны сделать свой установщик «Name» модифицировать параметр, который он принимает ('значение'), чтобы записать имя? –