Я хочу получить PropertyInfo для определенного свойства. Я мог бы использовать:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
Но должен быть способ сделать что-то похожее на
typeof(MyProperty) as PropertyInfo
Здесь? Или я застрял в сравнении строк с небезопасным типом?
Ура.
c#
reflection
tenpn
источник
источник
PropertyInfo result =
вместоvar result =
.Существует способ .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(); } } }
источник
Expression
PropertyHelper<Derived>.GetProperty(x => x.BaseProperty);
. См stackoverflow.com/questions/6658669/...Ты можешь это сделать:
typeof(MyObject).GetProperty("MyProperty")
Однако, поскольку C # не имеет «символьного» типа, ничто не поможет вам избежать использования строки. Кстати, почему вы называете это типо-небезопасным?
источник
Отражение используется для оценки типа среды выполнения. Таким образом, ваши строковые константы не могут быть проверены во время компиляции.
источник