特定のプロパティのPropertyInfoを取得したい。私は使用できます:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
しかし、似たようなことをする方法がなければなりません
typeof(MyProperty) as PropertyInfo
ある?それとも、タイプセーフでない文字列比較を行うのにこだわっていますか?
乾杯。
C#6の一部であり、Visual Studio 2015で使用可能な新しいnameof()
演算子を使用できます。詳細情報 here 。
あなたの例では次を使用します:
_PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
_
コンパイラはnameof(MyObject.MyProperty)
を文字列「MyProperty」に変換しますが、Visual Studio、ReSharperなどはどのようにnameof()
値をリファクタリングします。
文字列を使用しないラムダ/ 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();
}
}
}
あなたはこれを行うことができます:
typeof(MyObject).GetProperty("MyProperty")
ただし、C#には「シンボル」型がないため、文字列の使用を避けるのに役立つものは何もありません。ちなみに、なぜこのタイプを安全でないと呼ぶのですか?
リフレクションは、ランタイムタイプの評価に使用されます。したがって、コンパイル時に文字列定数を検証することはできません。