Подтвердить что ты не робот

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 4

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

Ответ 5

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

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

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

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

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

Спасибо TKTS..

Ответ 6

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

Ответ 7

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

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