web-dev-qa-db-ja.com

特定のプロパティのPropertyInfoを取得する方法は?

特定のプロパティのPropertyInfoを取得したい。私は使用できます:

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

しかし、似たようなことをする方法がなければなりません

typeof(MyProperty) as PropertyInfo

ある?それとも、タイプセーフでない文字列比較を行うのにこだわっていますか?

乾杯。

77
tenpn

C#6の一部であり、Visual Studio 2015で使用可能な新しいnameof()演算子を使用できます。詳細情報 here

あなたの例では次を使用します:

_PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
_

コンパイラはnameof(MyObject.MyProperty)を文字列「MyProperty」に変換しますが、Visual Studio、ReSharperなどはどのようにnameof()値をリファクタリングします。

53

文字列を使用しないラムダ/ Expressionを使用した.NET 3.5の方法があります...

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();
        }
    }
}
130
Marc Gravell

あなたはこれを行うことができます:

typeof(MyObject).GetProperty("MyProperty")

ただし、C#には「シンボル」型がないため、文字列の使用を避けるのに役立つものは何もありません。ちなみに、なぜこのタイプを安全でないと呼ぶのですか?

12

リフレクションは、ランタイムタイプの評価に使用されます。したがって、コンパイル時に文字列定数を検証することはできません。

1
Darin Dimitrov