Получить строковое имя свойства, используя отражение

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

    1. Все свойства в классе

    2. Одно свойство, если вы знаете имя строки

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

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

7 ответов

Решение

Если у вас уже есть 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);

Редактировать:

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

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

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

var propertyName = GetPropertyName(
    () => myObject.AProperty); // returns "AProperty"

С 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);

В случае, если это кому-то нужно... вот вариант ответа на 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)

Точно правильный ответ, который написан 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 ..

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

    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;
    }

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

Другие вопросы по тегам