Если вы действительно имеете в виду свойство current (название вопроса):
public static string GetCallerName([CallerMemberName] string name = null) {
return name;
}
...
public string Foo {
get {
...
var myName = GetCallerName(); // "Foo"
...
}
set { ... }
}
это передает работу компилятору, а не среде выполнения, и работает независимо от встраивания, обфускации и т. д. Обратите внимание, что для этого требуется директива using
using System.Runtime.CompilerServices;
, C# 5 и .NET 4.5 или аналогичная.
Если вы имеете в виду пример:
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;
}
i.e.
Expression<Func<object>> expr = () => new News().Bar;
var name = GetMemberName(expr); // "Bar"
person
Marc Gravell
schedule
11.03.2013
PropertyInfo
изMethodInfo
геттера/сеттера? - person Jeppe Stig Nielsen   schedule 11.03.2013LocaleValues
мог узнать, что он был найден через свойство с именемName
? Код, который у вас есть, вероятно, каждый раз возвращаетget_Method
? Может быть, вам следует заставить ваш установщикName
изменить параметр, который он принимает в (value
), чтобы записать имя? - person Jeppe Stig Nielsen   schedule 11.03.2013