Assembly + Attribute

15/05/2009 - 13:05 von Peter Forstmeier | Report spam
Hallo zusammen,

Ich will Klassen dynamisch aufrufen. Dazu habe ich mir folgendes gedacht:

Erstellen eines Attributes das die aufzurufenden Klassen kennzeichnet.

Durchsuchen der Assembly nach dem vorhandensein des Attributes (sind alle im
selben namespace).
Die zurückgelieferten Klassen in eine Liste (Hashtable oà) eintragen und
dann über diese Liste den dynamischen Zugriff durchführen.

Denkbar wàre auch die Klassen über Vererbung zu suchen da sie alle von einer
Basisklasse ableiten.

Bin ich da auf dem Holzweg? Bessere (andere) Ideen sind jederzeit
willkommen.

Kann mir hier jemand helfen da ich keinen Plan habe wie ich das machen soll.

Danke
Peter
 

Lesen sie die antworten

#1 Günter Prossliner
15/05/2009 - 14:03 | Warnen spam
Hallo Peter!

Ich will Klassen dynamisch aufrufen. Dazu habe ich mir folgendes
gedacht:
Erstellen eines Attributes das die aufzurufenden Klassen kennzeichnet.



Ist ok so.

Durchsuchen der Assembly nach dem vorhandensein des Attributes (sind
alle im selben namespace).



Der Namespace ist im Endeffekt eine Meta-Information und nicht relevant. Du
kannst (über Reflection) auch gar nicht alle Typen eines Namespaces direkt
zurückgeben (es gibt auch kein "NamespaceInfo" o.à.). Du musst im Endeffekt
alle Typen des Assemblies enumerieren (assembly.GetTypes()) und dann die
Überprüfung auf den Namespace selbst durchführen.

Ich würde entweder das Attributabfrage oder die Variante mit dem Namespace
verwenden. Die Variante mit dem Attribut ist flexibler. Wenn Du z.b. (in
einer neuen Version) solche Klassen nicht nur in einem Assembly drinnen hast
stehst Du mit dem Namespace-Ansatz im Endeffekt an (dort einen "fremden"
Namespace zu verwenden nur dass die Klasse von Deiner Logik gefunden wird
ist sicherlich auch nicht die richtige Heransgehensweise).

Bei der Lösung mit dem Attribut kannst Du assemblyübergreifend arbeiten und
ausserdem noch zusàtzliche Metadaten (als Attribut-Parameter) hinterlegen
bevor Du eine Instanz der Klasse erstellst. Das ist mit dem Namespace Ansatz
ebenfalls nicht möglich.

Ich habe schon mal den einen oder den anderen Ansatz (z.b. auch in Form von
nested classes) verwendet. Es ist alles beides möglich und auch sinnvoll. Es
hàngt vom Anwendungsfall ab.

Die zurückgelieferten Klassen in eine Liste (Hashtable oà) eintragen
und dann über diese Liste den dynamischen Zugriff durchführen.



Besser eine generische Liste.

Denkbar wàre auch die Klassen über Vererbung zu suchen da sie alle
von einer Basisklasse ableiten.



Es schliesst sich nicht aus. Im Gegenteil: Meist besteht so eine Lösung aus
eben beiden Teilen. Zum einen müssen die Typen gefunden werden (über Konfig,
über Attribut, über Namespace, ...). Zum einen müssen Methoden aufgerufen
werden. Und dort bietet sich klarerweise eine abstrakte Basisklasse bzw. ein
Interface an. Vor allem weil es bereits der Kompiler bemerkt wenn eine (bzw.
die) Einstiegsmethode nicht existiert bzw. eine andere Signatur hat.

Bin ich da auf dem Holzweg? Bessere (andere) Ideen sind jederzeit
willkommen.



Der prinzipielle Weg passt schon. Verwende eine Methode für das Discovery
(z.b. Attribut) und eine Basisklasse bzw. ein Interface für den Aufruf.

Nur die Basisklasse zu nehmen (also alles was von einer Klasse ableitet und
nicht selbst abstract ist) ist oft mit Einschrànkungen in der
Erweiterbarkeit verbunden (z.b. Vererbungshierachie).



OK?
mfg GP

Ähnliche fragen