2009-07-16 3 views
1

Dans un de mes projets, je suis en train de faire ceci:VB.NET: Optimiser l'initialisation de plusieurs classes

addTemplateToList(New docNULL) 
    addTemplateToList(New docAgenda) 
    addTemplateToList(New docAgendaNew) 
    addTemplateToList(New docOffer) 
    : 
     20 more 
    : 
    addTemplateToList(New docRequest) 

toutes les classes héritent docMain et addTemplateToList (X) ajoute x à une liste (de docMain). Maintenant, ma question est: Y at-il une meilleure façon de faire ce qui est fait dans l'échantillon de code?

Je pensais que quelque chose comme:

for all x as docMain in ALLAVAILABLECLASSES 
    if x.className().beginswith("doc") then addTemplateToList(x) 
next 

Est-ce possible dans une certaine façon VB.net (réflexion?)?

+0

Ne serait pas vous vérifiez si les classes héritent de docMain, plutôt que de vérifier le préfixe du nom de classe? En outre, il s'agit sans doute d'une "odeur de code" si vous avez seulement une instance de chaque classe. Par exemple, est-il possible que docAgenda puisse agir comme docAgendaNew si certaines variables privées étaient correctement définies? – MarkJ

Répondre

1

J'ai trouvé une solution assez simple à mon problème:

Dim m As Type = Type.GetType("mainARGQ.docCreator") 
    For Each TypeObj As Type In [Assembly].GetExecutingAssembly().GetTypes() 
     If TypeObj.BaseType Is m And TypeObj IsNot m Then 
      addTemplateToList(Activator.CreateInstance(TypeObj)) 
     End If 
    Next 

Edit: Je me demandais s'il y a un moyen de simplifier "TypeObj.BaseType Est-m et TypeObj IsNot m"

+0

Un type de base de classe n'est jamais lui-même, vous pouvez donc vous débarrasser de la partie Et. – Wilhelm

0

Vous avez besoin d'utiliser la réflexion, encore mieux d'utiliser MEF (http://www.codeplex.com/MEF) pour coller de nouveaux modules lors de l'exécution ou simplement en supprimant une DLL.

Comme quelqu'un l'a déjà dit, cela ne le rendra pas plus rapide et moins de code.

Questions connexes