Как получить PropertyInfo конкретного свойства?
Я хочу получить PropertyInfo для конкретного свойства. Я мог бы использовать:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
но там должен быть способ сделать что-то подобное
typeof(MyProperty) as PropertyInfo
есть? Или я застрял, делая небезопасное сравнение строк типа?
Ура.
4 ответа:
можно использовать
nameof()
оператор, который является частью C# 6 и доступен в Visual Studio 2015. Подробнее здесь.для вашего примера вы будете использовать:
PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
компилятор преобразует
nameof(MyObject.MyProperty)
к строке "MyProperty", но вы получаете возможность рефакторинга имени свойства без необходимости помнить, чтобы изменить строку, потому что Visual Studio, ReSharper и тому подобное знают, как рефакторингnameof()
значения.
есть способ .NET 3.5 с lambdas/
Expression
это не использует строки...using System; using System.Linq.Expressions; using System.Reflection; class Foo { public string Bar { get; set; } } static class Program { static void Main() { PropertyInfo prop = PropertyHelper<Foo>.GetProperty(x => x.Bar); } } public static class PropertyHelper<T> { public static PropertyInfo GetProperty<TValue>( Expression<Func<T, TValue>> selector) { Expression body = selector; if (body is LambdaExpression) { body = ((LambdaExpression)body).Body; } switch (body.NodeType) { case ExpressionType.MemberAccess: return (PropertyInfo)((MemberExpression)body).Member; default: throw new InvalidOperationException(); } } }