6
votes

Utilisation de la réflexion pour définir une propriété d'une propriété d'un objet

J'ai deux classes.

Class2 myObject = new Class2();
myObject.myClass1Object.value = "some value";


2 commentaires

Ceci est absolument possible à l'aide de la réflexion standard, même si vous n'avez que des règles génériques, il semble que ce soit une logique unique qui pourrait être mieux accomplie sans réfléchir.


@Quintin je me rends compte que mon exemple est un peu conçu; Cependant, ma situation réelle est effectivement beaucoup plus complexe que l'exemple que j'ai affiché et reflète effectivement pour accomplir.


3 Réponses :


14
votes

Fondamentalement divisez-le en deux accès de propriété. D'abord, vous get la propriété myClass1Object , alors vous définissez la valeur de la valeur sur le résultat.

Évidemment vous Il faut prendre le format que vous avez le nom de la propriété et le scinder - par exemple par points. Par exemple, cela devrait faire une profondeur arbitraire de propriétés: xxx

Certes, vous voudrez probablement un peu plus de vérification des erreurs que celle-ci :)


6 commentaires

Très sympa. Je m'avais aventuré cette route essayant déjà d'obtenir la propriétéInfo de la première propriété, mais j'ai rencontré un mur lorsque j'ai essayé d'appeler Stivalue parce que je n'ai pas eu la source (c'est-à-dire que vous avez fourni la pièce manquante avec le getvalue) . Merci!


Merci! J'ai eu une version récursive de cela. Cette mise en œuvre est bien meilleure: adoptée!


J'ai essayé de faire quelque chose d'équivalent avec des champs d'une structure (Fieldinfo, Obtenez / Setfield, etc.) mais n'a pas eu de chance. Cela devrait-il se comporter différemment? Par exemple, struct A contient la structure B qui contient un int i. SetProperty (source, "b.i", 4) ne change pas a.b.i à 4. Toute pensée?


@RYAN: À ce point, vous obtiendrez la propriété B , qui prendra une copie de celle-ci, mutation de la copie, mais ne pas attribuer à la copie sur B . Fondamentalement, vous devriez éviter les structures mutables car elles rendent ce genre de chose douloureuse.


@Jonskeet merci pour votre réponse. Ça a du sens. J'ai travaillé autour de cela en jetant des choses (le champ et l'objet source) sur une pile dans la boucle de la boucle, puis apparaissant et affectant sur le chemin du retour. Ce n'est peut-être pas joli, mais ça marche.


@Ryan: Eh bien, cela fonctionne autour de ce problème particulier - mais je vous exhorte toujours très fortement à éviter d'utiliser des structures mutables.



1
votes

Je cherchais des réponses sur le cas où obtenir une valeur de propriété, lorsque le nom de la propriété est donné, mais le niveau de nidification de la propriété n'est pas connu.

par exemple. Si l'entrée est "valeur" au lieu de fournir un nom de propriété pleinement qualifié comme "myClass1Object.value".

Vos réponses ont inspiré ma solution récursive ci-dessous: xxx


0 commentaires

0
votes
   public static object GetNestedPropertyValue(object source, string property)
    {
        PropertyInfo prop = null;
        string[] props = property.Split('.');

        for (int i = 0; i < props.Length; i++)
        {
            prop = source.GetType().GetProperty(props[i]);
            source = prop.GetValue(source, null);
        }
        return source;
    }

0 commentaires