Obtenir la valeur de la propriété par son nom

Veuillez considérer cette classe:

public static class Age { public static readonly ssortingng F1 = "18-25"; public static readonly ssortingng F2 = "26-35"; public static readonly ssortingng F3 = "36-45"; public static readonly ssortingng F4 = "46-55"; } 

Je veux écrire une fonction qui obtient “F1” et renvoie “18-25” .Par exemple

 private ssortingng GetValue(ssortingng PropertyName) .... 

Comment puis-je le faire?

Vous pouvez simplement utiliser l’instruction SWITCH pour effectuer la tâche ci-dessus:

 public static ssortingng GetValue(ssortingng PropertyName) { switch (PropertyName) { case "F1": return Age.F1; case "F2": return Age.F2; case "F3": return Age.F3; case "F4": return Age.F4; default: return ssortingng.Empty; } } 

En utilisant Reflection, vous pouvez faire comme ceci:

 public static ssortingng GetValueUsingReflection(ssortingng propertyName) { var field = typeof(Age).GetField(propertyName, BindingFlags.Public | BindingFlags.Static); var fieldValue = field != null ? (ssortingng)field.GetValue(null) : ssortingng.Empty; return fieldValue; } 

J’ai fait des tests, dans ce cas cela fonctionnera:

 public static ssortingng GetValue(ssortingng PropertyName) { return typeof(Age).GetField(PropertyName).GetValue(typeof(Age)); } 

Il semble que les constantes statiques fonctionnent un peu différemment. Mais ce qui précède a fonctionné avec la classe dans l’OQ.

Pour un cas plus général, voir cette question .


Voici comment cela se fait avec reflection:

 public static ssortingng GetValue(ssortingng PropertyName) { return Age.GetType().GetProperty(PropertyName).ToSsortingng(); } 

Remarque: GetProperty () peut renvoyer null, ce qui planterait si vous passiez “F9999”

Je n’ai pas testé, vous pourriez avoir besoin de ceci:

 public static ssortingng GetValue(ssortingng PropertyName) { return Age.GetType().GetProperty(PropertyName,BindingFlags.Static).ToSsortingng(); } 

Cas général comme le commentaire:

 public static ssortingng GetValue(object obj, ssortingng PropertyName) { return obj.GetType().GetProperty(PropertyName,BindingFlags.Static).ToSsortingng(); } 

Utilisez la reflection avec Linq:

  private ssortingng GetValue(ssortingng propertyName) { return typeof(Age).GetFields() .Where(field => field.Name.Equals(propertyName)) .Select(field => field.GetValue(null) as ssortingng) .SingleOrDefault(); } 

vous devriez utiliser la classe Type . vous pouvez obtenir celui de la classe que vous utilisez avec la fonction getType() . Une fois que vous avez le type, utilisez la fonction GetProperty . vous obtiendrez une classe propertyinfo . cette classe a une fonction getValue . cette valeur retournera la valeur de la propriété.

essayez ceci et appréciez:

 public static ssortingng GetValueUsingReflection(ssortingng propertyName) { var field = Type.GetType("Agenamespace" + "." + "Age").GetField(propertyName, BindingFlags.Public | BindingFlags.Static); var fieldValue = field != null ? (ssortingng)field.GetValue(null) : ssortingng.Empty; return fieldValue; } 

Agenamespace est un espace de noms dans lequel la classe Age est déclarée.