![]() |
AW: Typen / Klassen als Parameter verwenden
Nicht so kompliziert denken und einfach Instanzmethoden daraus machen ;) ? Ich sehe da keinen Nachteil - und wie gesagt können sich dadurch sogar ganz andere Möglichkeiten eröffnen :) :
Code:
Wirf eine weitere Assembly mit einer ServerEvent-Ableitung in den bin-Ordner und MEF wird sie ohne weiteres Zutun ebenfalls dem Dispatcher zuordnen. Und jetzt sag mir, dass das mit statischen virtuellen Methoden eleganter lösbar sei :) .
class Dispatcher
{ [ImportMany] IEnumerable<ServerEvent> EventHandlers { get; set; } public Dispatcher() { // Here be MEF magic... var catalog = new DirectoryCatalog(@".\"); var container = new CompositionContainer(catalog); container.Composeparts(this); } void Receive() { ServerEvent handler = EventHandlers.First(h => h.Command == command); handler.Handle(); } } public abstract class ServerEvent { public virtual string Command { get { return ""; } } public void Handle(); } [Export(ServerEvent)] class IAmATeapotServerEvent : ServerEvent { ... } |
AW: Typen / Klassen als Parameter verwenden
Das klingt natürlich wirklich nett. Einen Haken hat das ganze allerdings: das gibts alles erst ab .Net 4 oder? Ich bin aber an 3.5 gebunden, durch andere Libraries...
Zitat:
|
AW: Typen / Klassen als Parameter verwenden
Du kannst doch einfach per reflection hergehen, die statischen Methode ermitteln und aufrufen.
Um die Typen zu finden die diese Methode implementieren kannst du im Prinzip hergehen und mittels linq abfragen, welche typen eine statische Methode dieses namens haben. Das ist aber nicht gerade Performant, weil die Abfrage alle typen nach der Methode abfragt. |
AW: Typen / Klassen als Parameter verwenden
Zitat:
Mal gucken ob ich nicht doch auf 4 umsteigen kann... |
AW: Typen / Klassen als Parameter verwenden
Hast Du Einfluss auf die Klassen die Du da verwendest? Kannst Du die z.B. mit einem Custom Attribut versehen oder von einem bestimmten Interface ableiten (ich weiss, bei statischen Methoden ist das eher Sinnlos, aber z.B. INamingContainer ist auch nur ein flagging interface das keine Methoden oder Properties vorgibt).
Das macht dann das Ermitteln der entsprechenden Typen ziemlich einfach. Ps: Ich erwähne jetzt nur am Rande das Prism virtuelle statische Methoden schon länger unterstützt: ![]() |
AW: Typen / Klassen als Parameter verwenden
Zitat:
Wie sich das nun auswirkt, verstehe ich allerdings nicht, denn von Reflection in C# habe ich ehrlichgesagt null Ahnung ;) |
AW: Typen / Klassen als Parameter verwenden
Du kannst sowas machen:
Code:
Du hast in results dann eine Liste aller Typen, die Dein Flagging interface haben.
var results = from type in someAssembly.GetTypes()
where typeof(IFoo).IsAssignableFrom(type) select type; Der Aufruf sieht dann in etwa so aus:
Code:
var t := results.First();
foreach (MethodInfo mi in t.GetMethods(BindingFlags.Static | BindingFlags.Public)) { Console.WriteLine("method {0}", mi.Name); mi.Invoke(null, null); // parameter entsprechend setzen. } |
AW: Typen / Klassen als Parameter verwenden
Zitat:
![]()
Code:
ersetzen.
EventHandlers = Assembly.GetEntryAssembly().GetTypes().Where(t => t.IsSubclassOf(typeof(ServerEvent))).ToList();
Zitat:
Zitat:
Und ohne dir nahe treten zu wollen, oder überhaupt zu wissen, wie tief du schon in der CLR drinsteckst, ist es imo ein beeinträchtigender Fehler von Umsteigern, in einer managed Sprache Instanzierungen zählen zu wollen. Sagt mir jedenfalls meine eigene Erfahrung - man muss loslassen können, um zu genießen :stupid: . @Sebastian: Uh, jetzt musst du mir aber dringend erklären, wo du nun noch einen Vorteil von statischen Methoden + Reflection siehst. |
AW: Typen / Klassen als Parameter verwenden
Zitat:
|
AW: Typen / Klassen als Parameter verwenden
Zitat:
Code:
wird bei mir nicht zugelassen mit Fehler Verwendung eines Typen wie Variable etc... Ich hab ees dann hauptsächlich so versucht:
[Export(ServerEvent)]
Code:
da wird dann allerdings außer der abstrakten Basisklasse garnichts importiert. So wurde das ganze allerdings in den Beispielcodes die ich gefunden habe angewendet :gruebel:
[Export(typeof(ServerEvent))]
[ImportMany(typeof(ServerEvent))] Ich bitte um Erleuchtung :stupid: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz