[.NET] Classes die een bepaalde class erven opvragen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Is het mogelijk om een lijst te krijgen met classes die een bepaalde class erven op te vragen?

Stel ik heb class ProductA, ProductB en ProductC die allemaal van Product erven. Hoe kan ik dan een array krijgen met die 3 classes waarbij ik Product gebruik?

Dus iets als:
C#:
1
Type[] types = System........GetInheritingClasses(typeof(Product));

Beetje pseudocode.

Deze classes hebben ook allemaal dezelfde constructor (namelijk een lege), hoe kan ik dan vervolgens deze lijst doorlopen en er objecten van maken? De classes hoeven natuurlijk niet altijd hetzelfde te zijn, dus ik voorzie problemen daarmee? En ik zou het in de toekomst ook willen doen voor classes die wel parameters mee krijgen in de constructor.

[ Voor 31% gewijzigd door Tanuki op 21-03-2010 00:20 ]

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

Verwijderd

Je stelt de verkeerde vragen. Je loopt tegen implementatieproblemen aan omdat je verkeerd bent begonnen.

De vraag is niet hoe je een lijst classes opvraagt, de vraag is waarvoor je dit nodig denkt te hebben en hoe je dat beter kunt oplossen.

Acties:
  • 0 Henk 'm!

  • StM
  • Registratie: Februari 2005
  • Laatst online: 11:41

StM

Assembly.GetCallingAssembly().GetTypes(); geeft netjes een Type array terug. Daar kan je zo itereren over je classes en andere type's en info er over opvragen.

Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
Nou, ik heb een class Store. Daarin zitten een naam en een URL. En tevens een abstracte property met een getter genaamd RegExp.

Dan heb ik subclasses hiervoor, bijvoorbeeld StoreTop1Toys. Die zien er zo uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
public class StoreTop1Toys : Store
{
    public StoreTop1Toys()
        : base("Top1Toys", "http://fjsljdfksdf/")
    {
    }

    public override string RegExp
    {
        get { return "sjfldjksf"; }
    }
}


Nu wil ik dus een iets nettere oplossing dan ergens een List maken waar ik steeds een .Add() aan moet toevoegen als ik een nieuwe class maak voor een winkel.

Ik kwam al op:
C#:
1
2
3
4
5
6
7
8
                Type[] types = typeof(Store).Assembly.GetTypes();
                foreach (Type t in types)
                {
                    if (t.BaseType.Equals(typeof(Store)))
                    {
                        System.Reflection.ConstructorInfo i = t.GetConstructor(new Type[] { });
                    }
                }

Maar het enige wat ik kon vinden was de ConstructorInfo, maar ik kan geen instance terug krijgen van i.

[ Voor 28% gewijzigd door Tanuki op 21-03-2010 00:32 ]

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • Tharulerz
  • Registratie: April 2009
  • Laatst online: 10-04 05:16
Waarom zou je uberhaupt per product een klasse willen?

Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Wat denk je van die RegExp ook aan de base constructor mee te geven? Dan heb je de overbodige classes geëlimineerd.

Je moet pas subclasses gaan maken als deze van gedrag verschilt van de base class.
Er bestaan tal van voorbeeldjes waar duck inherit van bird enkel om bij "Getsound() { return "kwak"; }" te zetten.
Fout.
Je maakt een subclass voor pinguin omdat "Fly() { throw new CanNotFlyException(); }" het gedrag verandert.

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
H!GHGuY schreef op zondag 21 maart 2010 @ 08:32:
Wat denk je van die RegExp ook aan de base constructor mee te geven? Dan heb je de overbodige classes geëlimineerd.

Je moet pas subclasses gaan maken als deze van gedrag verschilt van de base class.
Er bestaan tal van voorbeeldjes waar duck inherit van bird enkel om bij "Getsound() { return "kwak"; }" te zetten.
Fout.
Je maakt een subclass voor pinguin omdat "Fly() { throw new CanNotFlyException(); }" het gedrag verandert.
Die regex is heel specifiek voor de website van 1 winkel. Die ga ik toch niet meegeven aan de constructor?

C#:
1
2
3
4
5
6
7
8
9
10
class Program
{
    private List<Store> stores;

    static void Main(string[] args)
    {
        stores = new List<Store>();
        stores.Add(new Store("Top1Toys", "http://sklfjfs/", "~heleLangeRegularExpressionDieEigenlijkNiksMetDeDefinitieVanDeWinkelVanDoenHeeft~"));
    }
}

Voordeel van dit is wel dat ik een list heb met winkels, die ik nodig heb..

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?


Acties:
  • 0 Henk 'm!

  • DEiE
  • Registratie: November 2006
  • Laatst online: 16-08 19:21
l0c4lh0st schreef op zondag 21 maart 2010 @ 09:40:
[...]

Die regex is heel specifiek voor de website van 1 winkel. Die ga ik toch niet meegeven aan de constructor?
Het "kwak"-geluid uit het voorbeeld van H!GHGuY is ook heel specifiek voor het type vogel.

Waar het om gaat is dat de verschillende winkels geen ander gedrag vertonen. Álle winkels hebben een reguliere expressie, en die wordt teruggegeven door de functie.
De winkels zijn in ontwerp hetzelfde, alleen in de gegevens niet. Door elke winkel een eigen subklasse te geven, maak je het jezelf onnodig veel te moeilijk. Stel dat je straks 400 winkels in je applicatie hebt zitten, dan heb je zoveel klassen dat je applicatie niet meer te onderhouden is.

[ Voor 17% gewijzigd door DEiE op 21-03-2010 11:02 ]


Acties:
  • 0 Henk 'm!

  • doskabouter
  • Registratie: Oktober 2004
  • Laatst online: 17-09 16:37
Volgens mij moet je gewoon deze hebben:

t.IsSubclassOf(typeof(Store))) dan werkt de inheritance ook wat dieper, en dan

(Store)Activator.CreateInstance(t).

Het grote voordeel van windows is dat je meer dos-boxen kan openen


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 11:39

Haan

dotnetter

l0c4lh0st schreef op zondag 21 maart 2010 @ 09:40:
[...]

Die regex is heel specifiek voor de website van 1 winkel. Die ga ik toch niet meegeven aan de constructor?

C#:
1
2
3
4
5
6
7
8
9
10
class Program
{
    private List<Store> stores;

    static void Main(string[] args)
    {
        stores = new List<Store>();
        stores.Add(new Store("Top1Toys", "http://sklfjfs/", "~heleLangeRegularExpressionDieEigenlijkNiksMetDeDefinitieVanDeWinkelVanDoenHeeft~"));
    }
}

Voordeel van dit is wel dat ik een list heb met winkels, die ik nodig heb..
Dit is juist precies wat je wel wilt ;)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Tanuki
  • Registratie: Januari 2005
  • Niet online
doskabouter schreef op zondag 21 maart 2010 @ 12:04:
Volgens mij moet je gewoon deze hebben:

t.IsSubclassOf(typeof(Store))) dan werkt de inheritance ook wat dieper, en dan

(Store)Activator.CreateInstance(t).
Dat werkt, dank u. :) Ik wist niet dat er een Activator class was die die method had.

PV: Growatt MOD5000TL3-XH + 5720wp, WPB: Atlantic Explorer v4 270LC, L/L: MHI SCM 125ZM-S + SRK 50ZS-W + 2x SRK 25ZS-W + SRK 20ZS-W Modbus kWh meter nodig?

Pagina: 1