Как получить PropertyInfo конкретного свойства? - PullRequest
74 голосов
/ 29 января 2009

Я хочу получить PropertyInfo для определенного свойства. Я мог бы использовать:

foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
    if ( p.Name == "MyProperty") { return p }
}

Но должен быть способ сделать что-то похожее на

typeof(MyProperty) as PropertyInfo

Есть? Или я застрял, сравнивая небезопасные строки?

Приветствие.

Ответы [ 4 ]

129 голосов
/ 29 января 2009

Существует способ .NET 3.5 с лямбдами / 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();
        }
    }
}
51 голосов
/ 17 декабря 2015

Вы можете использовать новый оператор nameof(), который является частью C # 6 и доступен в Visual Studio 2015. Подробнее здесь .

Для вашего примера вы бы использовали:

PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));

Компилятор преобразует nameof(MyObject.MyProperty) в строку «MyProperty», но вы получаете преимущество возможности рефакторинга имени свойства без необходимости помнить об изменении строки, поскольку Visual Studio, ReSharper и тому подобное знают, как выполнить рефакторинг nameof() значения.

12 голосов
/ 29 января 2009

Вы можете сделать это:

typeof(MyObject).GetProperty("MyProperty")

Однако, поскольку C # не имеет типа «символ», нет ничего, что поможет вам избежать использования строки. Кстати, почему вы называете этот тип небезопасным?

1 голос
/ 29 января 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...