Accéder à la propriété par index

J’ai besoin d’accéder à une propriété par un index ou quelque chose de similaire. La raison pour laquelle est expliquée dans cette question déjà répondue . Cette réponse utilise Linq et je préfère quelque chose sans cette dépendance. Je n’ai aucun contrôle sur la classe.

public class myClass { private ssortingng s = "some ssortingng"; public ssortingng S { get { return s; } } } class Program { static void Main(ssortingng[] args) { myClass c = new myClass(); // I would like something similar // or same functionality ssortingng s = c["S"]; } } 

utiliser (EDIT – selon le commentaire):

 ssortingng s = c.GetType().GetProperty ("S").GetGetMethod().Invoke (c, null).ToSsortingng(); 

Il vous donne la valeur de la propriété (publique) nommée S de l’instance c quel que soit le type de c et n’utilise pas du tout LINQ bien que je dois admettre que je ne vois pas pourquoi LINQ devrait être un problème. .

Comme vous n’avez aucun contrôle sur la classe, vous pouvez utiliser la méthode d’extension et la reflection pour obtenir la valeur de la propriété par son nom:

 static class ObjectExtensions { public static TResult Get(this object @this, ssortingng propertyName) { return (TResult)@this.GetType().GetProperty(propertyName).GetValue(@this, null); } } 

Usage:

 class A { public ssortingng Z { get; set; } public int X { get; set; } } class Program { static void Main(ssortingng[] args) { A obj = new A(); obj.Z = "aaa"; obj.X = 15; Console.WriteLine(obj.Get("Z")); Console.WriteLine(obj.Get("X")); Console.ReadLine(); } } 

Vous pouvez obtenir la même chose en utilisant une propriété par défaut sur votre classe et une collection. Pourvu que vous souhaitiez toujours des chaînes, vous pouvez utiliser la classe Dictionary en tant que propriété par défaut.

Ensuite, dans le constructeur, vous pouvez initialiser myDictionary["s"] = "some ssortingng";

Vous pouvez ensuite utiliser myClass en tant que collection afin que myClass [“s”] renvoie “une chaîne”.

Reflection indique généralement que vous n’avez pas créé d’API pour effectuer le travail dont vous avez besoin. Si vous devez modifier le code, je vous recommande d’utiliser la propriété par défaut.

Voir cet article MSDN :