2010-01-12 4 views
1

Dans une partie spécifique du code, tapez Type.GetFields() plusieurs fois. Un appel peut l'appeler 5 fois ou plus. Un morceau de code peut également itérer des milliers de fois. ATM je n'ai pas besoin pour optimiser mais je demande si j'ai besoin de savoir comment.Mise en cache Type.GetXYZ

Comment puis-je mettre en cache ceci? J'espère que je peux faire quelque chose comme obj.GetType(). Tag ["myCacheId"] et tirer des données en cache. Mais je doute que je peux le faire. Puis-je joindre des données à un type en quelque sorte? J'espère vraiment que je n'ai pas recours à un singleton. Comment puis-je mettre en cache des données relatives à Type?

+0

Je dois comprendre pourquoi vous itérez quelque chose potentiellement à des milliers de fois où vous devez obtenir les champs de très nombreux plusieurs types pour être en mesure de donner une réponse appropriée. –

Répondre

3

Le CLR met en cache déjà des métadonnées. Très lent au premier appel quand il est creusé hors de l'assemblée, vite après. La mise en cache ne fera aucune différence.

+0

Bien que vrai, vous pouvez souvent l'améliorer en supprimant les appels de méthode. – codekaizen

+0

J'ai entendu cela une fois mais il ne m'a pas été effacé ce qui était caché. Si c'est les métadonnées que je touche alors génial =). Je ferai un test quand j'en aurai vraiment besoin. Maintenant, en y réfléchissant, mon code devrait être assez rapide. –

0

bâton juste dans un FieldInfo[] quelque part, comme au début de votre méthode ou avant votre boucle:

FieldInfo[] fields = Type.GetFields((BindingFlags.Public | 
    BindingFlags.Static | BindingFlags.Whatever)); 
0

Si vous avez plusieurs types, vous pouvez utiliser un dictionnaire pour mapper de chaque type les informations mises en cache pour ce type. (Mais cela ne sera utile que si la recherche de dictionnaire est plus rapide que l'opération Type.GetFields!)