Avatar billede ncp Nybegynder
18. maj 2006 - 22:34 Der er 14 kommentarer og
2 løsninger

Finde Classes som arver bestem Class?

Hvordan finder jeg alle classes under et bestem namespace, som arver en given class?

ex:
Min base class:

public class myBase
{
  ...
}


- og så vil jeg gerne kunne finde alle disse classes:

public class myA : myBase
{
  ...
}

public class myB : myBase
{
  ...
}

public class myC : myBase
{
  ...
}

Hpber i forstår :D
Avatar billede nielle Nybegynder
18. maj 2006 - 22:36 #1
Hvad præcis mener du med at finde klasserne? Skal det bruges i et program, eller hvordan?
Avatar billede arne_v Ekspert
18. maj 2006 - 22:39 #2
du kan ikke finde alle klasser i et givet namespace som arver fra en bestemt klasse

du boer kunne finde alle klasser fra en given assembly i et givet namespace som arver fra en bestemt klasse
Avatar billede ncp Nybegynder
18. maj 2006 - 22:44 #3
Okay, det med namespaces er heller ikke så vigtigt, de er alle sammen i den samme assembly - ved du hvordan jeg gennemsøger en assembly?
Avatar billede arne_v Ekspert
18. maj 2006 - 22:45 #4
Assembly Load GetTypes

maa vaere noegleordene
Avatar billede arne_v Ekspert
18. maj 2006 - 22:46 #5
du kan sagtens teste for namespaces men du er noed til at angive hvilken
eller hvilke assemblies du vil lede i
Avatar billede hmortensen Nybegynder
18. maj 2006 - 22:55 #6
Du kan enten loade den aktualle assembly, eller fra en fil.
Assembly a = Assembly.GetExecutingAssembly();
eller
Assembly a = Assembly.LoadFile(@"c:\myAssembly.dll");

Og så kan du gennemløbe alle typerne:
foreach (Type t in a.GetTypes())
{
  if (t.IsClass && t.BaseType.Name == "myBase")
  {
    //Nedarver fra myBase
  }
}
Avatar billede driis Nybegynder
18. maj 2006 - 22:57 #7
Simpelt eksempel til inspiration: Kigger i den assembly, typen er defineret i - alle typer defineret gås igennem, og dem der arver fra A (IsSubClassOf) skrives ud.
using System;

namespace ReflectionTest
{
    public class A { }
    public class B : A { }
    public class C : A { }
    public class D { }
   
    class Program
    {
        static void Main(string[] args)
        {
            Type baseType = typeof(A);
            foreach( Type t in baseType.Assembly.GetTypes())
            {
                if (t.IsSubclassOf(baseType))
                    Console.WriteLine(t.FullName);
            }
        }
    }
}

Så vidt jeg husker du'r IsSubClassOf ikke, hvis baseType er et interface - men hvis du har behov for dette, kan du bruge GetInterfaces til at få fat i de interfaces, en type implementerer.
Avatar billede ncp Nybegynder
18. maj 2006 - 22:59 #8
Takker, det hjalp med lidt focus :D

her er en løsning, hvis andre skulle få brug for noget der ligner:

foreach (Type myType in Assembly.GetAssembly(typeof(myBase)).GetTypes())
{
  if (myType.IsAbstract || !myType.IsPublic)
    continue;
 
  if (myType.BaseType == typeof(StockProviderBase))
  {
    MessageBox.Show(myType.ToString()+ " arver myBase!");
  }
}
Avatar billede ncp Nybegynder
18. maj 2006 - 23:02 #9
(i linje 6 skal StockProviderBase lige udskiftes med myBase :)
Avatar billede ncp Nybegynder
18. maj 2006 - 23:06 #10
det var arne_v's keywords som gjorde jeg fandt min løsning, så points må gå til ham hvis han vil have dem?
Avatar billede arne_v Ekspert
18. maj 2006 - 23:12 #11
vi kan vel dele

man behoever jo ikke faa alle points fordi man er doven og det er hurtigere at
skrive keywords end et kode eksempel
Avatar billede ncp Nybegynder
19. maj 2006 - 00:05 #12
true :)
Avatar billede arne_v Ekspert
19. maj 2006 - 00:45 #13
blev hmortensen ikke snydt ?
Avatar billede hmortensen Nybegynder
19. maj 2006 - 07:38 #14
Snydt og snydt, vi fik hjulpet spørger, og det er det vigtigeste :)
Avatar billede arne_v Ekspert
27. maj 2006 - 02:31 #15
Har du ikke bemærket http://www.eksperten.dk/spm/710483 ?
Avatar billede hmortensen Nybegynder
27. maj 2006 - 10:47 #16
Nej det havde jeg ikke da du ikke havde smidt en referrence her ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester