Comment obtenir le PropertyInfo d’une propriété spécifique?

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 est-ce que je suis coincé à faire une comparaison de chaînes non sécurisée?

À votre santé.

Vous pouvez utiliser le nouvel opérateur nameof() faisant 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 aurez l’avantage de pouvoir refactoriser le nom de la propriété sans vous rappeler de changer la chaîne, car Visual Studio, ReSharper et similaires savent comment refactoriser nameof() valeurs.

Il y a une manière .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 ssortingng Bar { get; set; } } static class Program { static void Main() { PropertyInfo prop = PropertyHelper.GetProperty(x => x.Bar); } } public static class PropertyHelper { public static PropertyInfo GetProperty( Expression> 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, comme C # n’a pas de type “symbole”, rien ne vous aidera à éviter d’utiliser de la chaîne. Pourquoi appelez-vous ce type dangereux, au fait?

La reflection est utilisée pour l’évaluation de type à l’exécution. Ainsi, vos constantes de chaîne ne peuvent pas être vérifiées au moment de la compilation.