Quiero obtener PropertyInfo para una propiedad específica. Podría usar:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
Pero debe haber una forma de hacer algo similar a
typeof(MyProperty) as PropertyInfo
¿Esta ahí? ¿O estoy atascado haciendo una comparación de cadenas de tipo inseguro?
Salud.
c#
reflection
tenpn
fuente
fuente
PropertyInfo result =
lugar devar result =
.Hay una forma .NET 3.5 con lambdas /
Expression
que no usa cadenas ...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(); } } }
fuente
Expression
PropertyHelper<Derived>.GetProperty(x => x.BaseProperty);
. Ver stackoverflow.com/questions/6658669/…Puedes hacerlo:
typeof(MyObject).GetProperty("MyProperty")
Sin embargo, dado que C # no tiene un tipo de "símbolo", no hay nada que le ayude a evitar el uso de cadenas. Por cierto, ¿por qué llamas inseguro a este tipo?
fuente
La reflexión se utiliza para la evaluación del tipo de ejecución. Por lo tanto, sus constantes de cadena no se pueden verificar en tiempo de compilación.
fuente