Получить строковое имя свойства, используя отражение - PullRequest
45 голосов
/ 07 сентября 2010

Существует множество примеров рефлексии, которые позволяют вам получить:

Есть ли способ (используя отражение, TypeDescriptor или иным образом), чтобы получить имя строки свойства в классе во время выполнения, при условии, что у меня есть всеявляется экземпляром класса и свойства?

EDIT Я знаю, что могу легко получить все свойства в классе с помощью отражения, а затем получить имя каждого свойства.Я запрашиваю функцию, которая дает мне имя свойства, при условии, что я передаю ему экземпляр свойства.Другими словами, как найти требуемое свойство из массива PropertyInfo [], возвращенного мне из class.GetType (). GetProperty (myProperty), чтобы я мог получить из него PropertyInfo.Name?

Ответы [ 7 ]

89 голосов
/ 07 сентября 2010

Если у вас уже есть PropertyInfo, то ответ @ dtb будет правильным. Однако, если вы хотите выяснить, в каком коде свойства вы находитесь в данный момент, вам придется просмотреть текущий стек вызовов, чтобы выяснить, какой метод вы выполняете в данный момент, и получить имя свойства оттуда.

var stackTrace = new StackTrace();
var frames = stackTrace.GetFrames();
var thisFrame = frames[0];
var method = thisFrame.GetMethod();
var methodName = method.Name; // Should be get_* or set_*
var propertyName = method.Name.Substring(4);

Edit:

После вашего разъяснения мне интересно, что вы хотите сделать, это получить имя свойства из свойства выражение . Если это так, вы можете написать такой метод:

public static string GetPropertyName<T>(Expression<Func<T>> propertyExpression)
{
    return (propertyExpression.Body as MemberExpression).Member.Name;
}

Чтобы использовать его, вы должны написать что-то вроде этого:

var propertyName = GetPropertyName(
    () => myObject.AProperty); // returns "AProperty"
47 голосов
/ 24 июля 2015

В C # 6.0 (Visual Studio 2015) теперь вы можете использовать оператор nameof, например:

var obj = new MyObject();
string propertyName = nameof(obj.Property);
string methodName = nameof(obj.Method);
string directPropertyName = nameof(MyObject.Property);
string directMethodName = nameof(MyObject.Method);
13 голосов
/ 07 сентября 2010
5 голосов
/ 10 января 2011

На случай, если это кому-нибудь понадобится ... вот вариант ответа VB .NET:

Public Shared Function GetPropertyName(Of t)(ByVal PropertyExp As Expression(Of Func(Of t))) As String
   Return TryCast(PropertyExp.Body, MemberExpression).Member.Name
End Function

Использование:

Dim name As String = GetPropertyName(Function() (New myObject).AProperty)
3 голосов
/ 03 мая 2015

точно правильный ответ, который пишет TKTS, и здесь я просто хочу преобразовать его синтаксис в C #

public static string GetPropertyName<t>(Expression<Func<t>> PropertyExp)
{
return (PropertyExp.Body as MemberExpression).Member.Name;
}

, и использование этого кода соответствует примеру, приведенному ниже:

string name = GetPropertyName(() => (new Tasks()).Title);

Кроме того: может случиться исключение, что, когда в комплекте со всеми свойствами есть нулевые значения, так что любой должен принять это во внимание, когда реализует свой код

Спасибо TKTS ..

0 голосов
/ 16 декабря 2013

Я использовал версию, предоставленную Джейкобом, но иногда это давало исключение.Это было потому, что актерский состав был недействительным.Эта версия решила проблему:

    public static string GetPropertyName<T>(this Expression<Func<T>> propertyExpression)
    {
        ConstantExpression cExpr = propertyExpression.Body as ConstantExpression;
        MemberExpression mExpr = propertyExpression.Body as MemberExpression;

        if (cExpr != null)
            return cExpr.Value.ToString();
        else if (mExpr != null)
            return mExpr.Member.Name;

        else return null;
    }
0 голосов
/ 07 сентября 2010

myClassInstance.GetType().GetProperties() дает вам PropertyInfo экземпляров для всех открытых свойств для типа myClassInstance. (См. MSDN для документации и других перегрузок.) ´PropertyInfo.Name´ - это фактическое имя свойства. Если вы уже знаете имя свойства, используйте GetProperty(name) для извлечения объекта PropertyInfo (см. Снова MSDN ).

...