Traiter l'objet comme le dictionnaire des propriétés en C #
Je veux être en mesure d'accéder à des valeurs de propriété à un objet, comme un dictionnaire, en utilisant le nom de la propriété à la clé. Je n'ai pas vraiment de soins si les valeurs sont retournées comme des objets, de sorte Dictionary<string, object>
est très bien. C'est l'utilisation prévue:
object person = new { Name: "Bob", Age: 45 };
IDictionary<string, object> lookup = new PropertyDictionary(person);
string name = (string)person["Name"];
person["Age"] = (int)person["Age"] + 1; //potentially editable
J'étais sur le point de mettre en œuvre ma propre classe, mais ensuite j'ai commencé à remarquer des classes comme DynamicObject mettre en œuvre les IDictionary interface, qui fait penser à ce qui était déjà fait pour moi quelque part.
Ce que je veux, c'est similaire à la fonctionnalité utilisée par ASP.NET MVC qui permet d'utiliser les types anonymes pour définir la balise HTML attributs. J'ai beaucoup de classes qui utilisent des dictionnaires en tant que sources de données, mais la plupart du temps, je devrais être capable de passer dans les objets.
Depuis que c'est pour un usage général bibliothèquej'ai pensé que je voudrais créer une classe réutilisable qui décorées simplement un objet avec la IDictionary interface. Il va me sauver de la création d'une explosion de surcharges.
source d'informationauteur Travis Parks
Vous devez vous connecter pour publier un commentaire.
Je ne crois pas qu'il y est construit .Type de réseau comme cela a déjà dans le .Net framework. Il semble que vous voulez vraiment créer un objet qui se comporte un peu comme un objet Javascript. Si oui, alors découlant de
DynamicObject
peut être le bon choix. Il vous permet de créer un objet qui, lorsqu'enveloppé avecdynamic
vous permet de lier directementobj.Name
ou par l'intermédiaire de l'indexeurobj["Name"]
.Vous pouvez l'utiliser pour envelopper tout type et de l'utilisation à la fois de l'indexeur et le nom de la syntaxe pour obtenir les propriétés
J'ai cette méthode d'extension, probablement le plus simple, il peut obtenir:
Maintenant vous pouvez le faire:
Remarque:
que ce dictionnaire est sensible à la casse (vous pouvez trivialement l'étendre en passant la droite
StringComparer
).qu'il ignore les indexeurs (qui sont également des propriétés), mais c'est à vous de travailler sur.
que la méthode n'est pas générique, considérant que cela n'aide pas la boxe, car intérieurement il appelle
obj.GetType
de sorte qu'il les boîtes de toute façon à ce stade.que vous obtenez uniquement les "lisible" propriétés (sinon, vous n'obtenez pas les valeurs). Puisque vous voulez qu'il soit "inscriptible" ainsi, alors vous devriez utiliser
CanWrite
drapeau.dynamique de mots clés peut être une option pour vous. il utilise dynamic language runtime. Au moment de l'exécution, il essaie de faire correspondre le plus proche de types disponibles dans le programme. Si elle ne peut pas, puis il convertit le type dynamique de dictionay objet, où la clé est le nom de la propriété et de la valeur est la valeur de la propriété.
suivez ces liens de MSDN:
Dynamiques à l'aide de mots clés de C#
dynamique (Référence C#)
DLR Aperçu
l'utilisation de la dynamique de l'échantillon soluce page