Получить строковое имя свойства, используя отражение
Существует множество примеров рефлексии, которые позволяют вам получить либо:
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).