2010-04-22 4 views
12

Quelle est la meilleure façon d'y parvenir en C#?C# - Valeurs de propriété récursives/de réflexion

string propPath = "ShippingInfo.Address.Street"; 

Je vais avoir un chemin de propriété comme celui ci-dessus lu à partir d'un fichier de mappage. Je dois pouvoir demander à l'objet Order quelle sera la valeur du code ci-dessous.

this.ShippingInfo.Address.Street 

Équilibre entre performance et élégance. Toutes les relations de graphe d'objets doivent être en tête-à-tête. Partie 2: comment serait-il difficile d'ajouter la possibilité de saisir le premier si c'est un <> Liste ou quelque chose comme ça.

Répondre

25

Peut-être que quelque chose comme ça? Ou, si vous préférez LINQ, vous pouvez essayer à la place. (Bien que je préfère personnellement la version non-LINQ.)

string propPath = "ShippingInfo.Address.Street"; 

object propValue = propPath.Split('.').Aggregate(
    (object)this, 
    (value, name) => value.GetType().GetProperty(name).GetValue(value, null)); 

Console.WriteLine("The value of " + propPath + " is: " + propValue); 
+0

+1 parce que l'exemple de code est plus court que sa description textuelle * g * – Foxfire

+0

J'aime ça. Je suis corrigé des difficultés d'exprimer cela.Cool implémentation LINQ aussi. – kmontgom

1

Sons comme un ensemble d'invocations de propriété imbriquées:

classe X a une propriété appelée ShippingInfo; le type représenté par ShippingInfo a une adresse de propriété; le type représenté par Address a une propriété appelée Street.

Donc, en supposant que vous connaissez l'instance appropriée de classe X à opérer sur: ("". ToCharArray())

  • tokenize la chaîne via string.split à une chaîne [], ou quelque chose comme ça
  • départ avec l'instance connue de X
  • de réflexion utilisation pour obtenir le MethodInfo pour le getter ShippingInfo
  • réflexion utilisation pour obtenir le type retourné par ShippingInfo get()
  • invoquons la getter utilisant la réflexion
  • en utilisant la valeur de retour de la ShippingInfo get() et le type de retour:
    • obtenir le MethodInfo pour le getter d'adresses dans le type retourné .....

et ainsi de suite. Vous obtenez l'image.

Cela semble un peu long et fastidieux, et c'est le cas. Mais c'est comme ça que vous le feriez par la réflexion.

Je me demande s'il est possible de faire la même chose avec LINQ to Objects?

La réponse à la partie 2 consiste à obtenir la valeur initiale de X à partir de votre liste <>.

+0

Pouvez-vous s'il vous plaît réécrire cela? Pas très facile à comprendre - trop de mots :) – Nayan

+0

Non. En tout cas, c'est trop bref et trop court. C'est le problème avec quelque chose comme la réflexion, il y a beaucoup d'étapes et chaque étape nécessite des connaissances spécifiques. Pardon. – kmontgom

Questions connexes