Technology Experience

Contenuti gestiti da Igor Damiani
posts - 949, comments - 2741, trackbacks - 15120

My Links

News

  • Questo blog si propone di raccogliere riflessioni, teoriche e pratiche, su tutto quello che riguarda il world-computing che mi sta attorno: programmazione in .NET, software attuale e futuro, notizie provenienti dal web, tecnologia in generale, open-source.

    L'idea è quella di lasciare una sorta di patrimonio personale, una raccolta di idee che un giorno potrebbe farmi sorridere, al pensiero di dov'ero e cosa stavo facendo.

    10/05/2005,
    Milano

Archives

Post Categories

Generale

Reflection: un tip per ottenere l'elenco dei tipi che ereditano da una classe base

Un piccolo tip che magari vale la pena pubblicare su UGIdotNET. Se avete la necessità di rilevare tutti i tipi definiti in un assembly, lo si può fare banalmente tramite Reflection.

public static List<Type> GetAllAvaiableRules()
{
    
// Type classRuleBase = typeof(RuleBase);
    
List<Type> ret = new List<Type>();
    Assembly janky = Assembly.GetExecutingAssembly();
    Type[] all = janky.GetTypes();

    
for (int i = 0; i < all.Length; i++)
        
// if (all[i].BaseType.Equals(classRuleBase))
            
ret.Add(all[i]);

    
return(ret);
}

Questo blocco di codice ritorna una List<Type> definiti nell'assembly corrente. Nulla di particolarmente complicato. La cosa interessante è che possiamo ottenere l'elenco dei tipi che ereditano da una classe base: basta discommentare le due righe. La prima dice qual'è il tipo della classe base. La classe Type espone una proprietà BaseType che ci dice per l'appunto qual'è il tipo che cui deriva. Basta un semplice if ed il gioco è fatto.

Breve disgressione sul perchè mi serve. Sto scrivendo, tempo permettendo, un editor a design-time per la Janky.Validation. Senza dettagliare troppo: ho bisogno di una ComboBox che mi elenchi tutte le regole definite nella Janky.Validation. Invece di crearlo a mano, lo faccio via Reflection, chiedendo appunto tutte le classi che ereditano da RuleBase. La classe RuleBase va l'override di ToString(), per cui con un banale data-binding la ComboBox è bella che pronta!

powered by IMHO 1.2

Print | posted on Wednesday, April 19, 2006 4:17 PM | Filed Under [ Tecnologia ]

Feedback

Gravatar

# Re: Reflection: un tip per ottenere l'elenco dei tipi che ereditano da una classe base

Invece di usare if (all[i].BaseType.Equals(classRuleBase)) ,
sarebbe più corretto utilizzare if(classRuleBase.IsSubclassOf(all[i])) perchè IsSubclassOf verifica tutta l'intera gerarchia metre BaseType quello immediatamente precedente.
Es suppoiniamo al seguente gerarchia Rule1Ex->Rule1->BaseRule con BaseType.Equals(classRuleBase) restituisce false , metre con IsSubclassOf restituisce giustamente true.
4/19/2006 5:37 PM | Giuseppe Lippolis
Gravatar

# re: Reflection: un tip per ottenere l'elenco dei tipi che ereditano da una classe base

ne parlavo anche con qualcun'altro di UGI.
:-)
effettivamente è corretto, però nel mio caso limitato voglio controllare solo il tipo immediatamente superiore, per cui preferisco fare così. Anche perchè esplorare l'intera gerarchia è cmq più dispendioso.
cmq, ben venga la tua correzione! ;-)
4/19/2006 5:46 PM | Igor Damiani
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET