Considérant que les données relativement statiques ne doivent pas être réévaluées mais mises en cache, je me demandais s'il est possible d'utiliser la réflexion pour obtenir des propriétés de classe une fois, puis de les mettre en cache afin de pouvoir évaluer de manière dynamique des propriétés de l'objet et de lire / attribuer des valeurs , mais pas la tête de réflexion chaque fois que je le fais. Est-ce possible (exemple de code?)?
Pour clarifier un peu, disons que j'ai cette classe: p> et j'essaie maintenant de faire une méthode qui me permet de faire quelque chose comme ceci (pseudocode): p> mise à jour doit maintenant vérifier au nom de la cache si elle sait déjà les propriétés du nuage (typeof (myClouDInstance)) et Ensuite, utilisez des informations en cache pour attribuer la propriété "iswhite" la valeur "vraie" au lieu de faire de la réflexion à nouveau. p> Toute idée sur la façon de faire? P> P>
5 Réponses :
Ce n'est pas clair exactement em> ce que vous faites, mais la mise en cache peut certainement faire une différence avec la réflexion. p>
En particulier, si vous appelez des méthodes (ou des getters de propriété / setters) et peut le faire de manière sûre en ce qui concerne le code d'appel, il peut faire un énorme différence em> si vous convertissez le Si vous pouviez nous donner un exemple complet de ce que vous essayez de faire, cela nous aiderait à trouver des idées plus spécifiques ou même du code. Si vous allez simplement mettre en cache un MéthodeInfo code> dans un délégué fortement tapé une fois, puis réutilisez cela. P>
PropertyInfo code> qui peut ne pas avoir autant (ou aucun) effet - il est possible que les méthodes normales
TYPE.GETPROPERTY CODE> (ETC) sont déjà assez vite. Comme toujours avec des questions de performance, la clé est de mesurer ce que vous faites réellement. Faire un changement et mesurer à nouveau, etc. p>
Votre réponse m'a allongé dans la bonne direction (comment mettre en cache de biensInfo) qui est effectivement plus rapide que GetProperty (il n'a pas encore eu le temps, mais la réactivité de ma page semble améliorée.)
Si vous pouvez cacher des délégués à appeler la propriété de manière sûre, cela pourrait bien le rendre plus rapide. Définitivement le temps, cependant ...
"Cela peut faire une énorme différence" est maintenant une liaison morte: /
Le coût de la réflexion n'a pas besoin d'être aussi gros que vous le pensez. En plus des délégués (que Jon discute), vous pouvez également utiliser des éléments tels que HyperDescriptor Pour minimiser le coût de la réflexion sans changer le code beaucoup - il devient tout simplement PropertyDescriptor Code> à la place:
object val = props["IsWhite"].GetValue(myCloudInstance);
Assemblée dynamique devrait aider à s'inquiéter des performances de réflexion. Quelqu'un a mis en œuvre des évaluateurs de propriétés à l'aide de l'assemblage dynamique ici . P>
Je pense que la meilleure façon de le faire est d'obtenir la méthode Getter ou Setter, le convertir en délégué et travailler avec le délégué, il n'y a pas de moyen plus rapide:
string value = get_Property1(type);
J'ai créé une haquetable pour mettre en cache les résultats de la réflexion. Première fois, il est nécessaire de passer un appel à getProperties et de stocker les résultats dans le Hastable. La prochaine fois, vérifiez d'abord la haquetable pour la liste des objets de propriétéInfo. S'il existe, utilisez-le. Sinon, invoquer getProperties.
J'utilise ceci pour mapper un digne d'information sur une liste d'entités. P>
Mon implémentation est basée sur: une défense sur la réflexion dans .net , de Nick Harrison ( http://www.simple-Talk.com.com /dotnet/.net-Framework/a-defense-of-reflection-in-.net/ ). P>
Alors, il est: P>
info.SetValue(newObject, _valor, null);