Je veux obtenir le PropertyInfo pour une propriété spécifique. Je pourrais utiliser:
foreach(PropertyInfo p in typeof(MyObject).GetProperties())
{
if ( p.Name == "MyProperty") { return p }
}
Mais il doit y avoir un moyen de faire quelque chose de similaire à
typeof(MyProperty) as PropertyInfo
Y a-t-il? Ou suis-je coincé à faire une comparaison de chaînes non sécurisée?
À votre santé.
Vous pouvez utiliser le nouvel opérateur nameof()
qui fait partie de C # 6 et disponible dans Visual Studio 2015. Plus d'informations ici .
Pour votre exemple, vous utiliseriez:
PropertyInfo result = typeof(MyObject).GetProperty(nameof(MyObject.MyProperty));
Le compilateur convertira nameof(MyObject.MyProperty)
en la chaîne "MyProperty" mais vous obtenez l'avantage de pouvoir refactoriser le nom de la propriété sans avoir à vous rappeler de changer la chaîne car Visual Studio, ReSharper et autres savent comment refactor nameof()
values.
Il existe un moyen .NET 3.5 avec lambdas/Expression
qui n'utilise pas de chaînes ...
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();
}
}
}
Tu peux le faire:
typeof(MyObject).GetProperty("MyProperty")
Cependant, puisque C # n'a pas de type "symbole", il n'y a rien qui vous aidera à éviter d'utiliser une chaîne. Pourquoi appelez-vous ce type dangereux, au fait?
La réflexion est utilisée pour l'évaluation du type d'exécution. Vos constantes de chaîne ne peuvent donc pas être vérifiées au moment de la compilation.