Как получить 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

Отражение используется для оценки типа времени выполнения. Поэтому ваши строковые константы не могут быть проверены во время компиляции.