Как получить PropertyInfo определенного свойства?
Я хочу получить PropertyInfo для определенного свойства. Я мог бы использовать:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
Но должен быть способ сделать что-то похожее на
typeof(MyProperty) as PropertyInfo
Есть ли? Или я застрял, проводя сравнение типов небезопасных строк?
Приветствия.
Ответы
Ответ 1
Вы можете использовать новый оператор nameof()
, который является частью С# 6 и доступен в Visual Studio 2015. Дополнительная информация здесь.
В вашем примере вы бы использовали:
PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
Компилятор преобразует nameof(MyObject.MyProperty)
в строку "MyProperty", но вы получите возможность рефакторировать имя свойства, не задумываясь о том, чтобы изменить строку, потому что Visual Studio, ReSharper и т.д. знают, как рефакторировать nameof()
.
Ответ 2
Существует способ .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();
}
}
}
Ответ 3
Вы можете сделать это:
typeof(MyObject).GetProperty("MyProperty")
Однако, поскольку С# не имеет типа "symbol", ничего не поможет избежать использования строки. Почему вы называете этот тип небезопасным, между прочим?
Ответ 4
Отражение используется для оценки типа времени выполнения. Поэтому ваши строковые константы не могут быть проверены во время компиляции.