Laden...

Klassen im Designer laden

Erstellt von eddieromm vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.730 Views
E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 9 Jahren
Klassen im Designer laden

Hallo Leute,

die Überschrift ist nicht so gelungen, sorry, aber ich weiss einfach nicht wie ich das in einen Satz beschreiben soll.

Also wir haben mehrere UserControls abgeleitet und mit verschiedenen Methoden usw. ausgestattet.

Da wir diese in allen derzeitigen und zukünftigen Projekten verwenden wollen, sind diese nun in einer Klassenbibliothek ausgelagert und die dll ist nun als Verweis hinzugefügt.

Eine der Eigenschaften ist zwar ein string, als Auswahl wird im Designer aber eine Liste mit Klassennamen angeboten.
Diese Klassen sind jedoch nicht in der Klassenbibliothek, sondern in dem eigentlichen Projekt definiert.

Aber wie komme ich aus der DLL auf die Assembly, in der das UserControl eingefügt wurde?
Bzw. ein UserControl, der von unseren CustomUserControl ableitet.

Zur Laufzeit ist es kein Problem, das bekomme mit

System.Reflection.Assembly.GetEntryAssembly()

Diese kann ich dann mit GetTypes() nach allen Klassen abfragen und mir die ich möchte rausfiltern, aber wie bekommt man das im Entwurf?

Gruß

212 Beiträge seit 2008
vor 9 Jahren

Hi,

wenn ich dich richtig verstanden habe, könnte das hier das richtige für dich sein!?

Gruß
Christoph

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 9 Jahren

Hallo Christoph1972,

das ist nicht unbedingt mein Problem.

Es ist so aufgebaut:

Ich habe eine Klassenbibliothek.
Diese hat ein UserControl welches "MyUserControl" heisst. Es sind Methoden usw. dazugekommen.

Nun habe ich ein neues Projekt und die Klassenbibliothek als Verweis hinzugefügt.

In diesen Projekt habe ich ein "TestUserControl" eingefügt und von MyUserControl abgeleitet.
Zusätzlich habe ich in meinen Projekt weitere Klassen:
Model1
Model2
Model3

MyUserControl hat eine Eigenschaft "ModelClassName", bei dieser Eigenschaft soll nun als Auswahl die drei Modelklassen von oben angezeigt werden.
Wie ich diese anzeige, wenn ich denn hätte, das weiss ich.

Mein Problem ist, dass ich im Designer nicht an diese Klassen rankomme. Ich kann mich nur innerhalb meiner Klassenbibliothek bewegen. Ich meine im Entwurf, zur Laufzeit hätte ich die schon.

Sogar der Typ des Controls ist "MyUserControl" und nicht "TestUserControl". Name schon, aber nicht der Typ.

Unser Ziel ist es also, CustomsUserControls zu haben, die wir in verschiedenen Projekten benutzen können, aber die Models sind jeweils unterschiedlich und das UserControl soll diese je nach Projekt erkennen und anzeigen.

Gruß

771 Beiträge seit 2009
vor 9 Jahren

Im Designer-Mode wirst du das automatisch nicht hinbekommen, denn das UserControl-Projekt weiß ja gar nicht, welche anderen Assemblies existieren.
Eine Möglichkeit wäre, daß du dem UserControl eine Property mit einer Liste der Assemblies übergibst oder aber ein Verzeichnisname, welches du dann rekursiv nach Assemblies durchsuchst.

Noch besser, aber wohl auch aufwendiger, wäre die Angabe der Solution-Datei (*.sln) als Eigenschaft und diese parst du dann nach den anderen Projekten.

Wenn du nur von einem Projekt die Klassen haben willst, kannst du dann die obigen Tipps darauf beschränken.

E
eddieromm Themenstarter:in
255 Beiträge seit 2004
vor 9 Jahren

Sollte eigentlich nur eine Erleichterung für die Entwickler sein.

Schade, ist aber nicht wild.

Danke

P
1.090 Beiträge seit 2011
vor 9 Jahren

Da kling so ähnlich wie die Auswahl beim Databinding.
Schau dir doch mal an wie es dot gemacht wird.

Sollte man mal gelesen haben:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

Gelöschter Account
vor 9 Jahren

Das Problem ist eigentlich nicht die externe Library, sondern das dass Reflection API nun mal nur zur Laufzeit sinnvoll anwendbar ist.

Wenn ich dich richtig verstehe hat die UserControl Basisklasse eine String Eigenschaft für die ein fester AuswahlDialog angeboten wird der eine bestimmte Auswahl an Klassen im Projekt anzeigen soll. (Über UIEditor und/oder StringValueConverter) Wenn du das zur Designzeit mit der ausgelagerten Library verbinden willst musst du deine Strategie ändern. Die Library reflektiert nicht mehr über das EntryAssembly sondern bekommt alle nötigen Informationen reingereicht. Damit kannst du in deiner UserControl Basisklasse die nötigen Informationen besser einsammeln und an die Library durchreichen. Idealerweise on-demand durch den Editor/Converter. Da der Designer nur eine Instanz der Basisklasse erstellt wird dir GetType() hier allerdings nicht helfen. Du kannst Visual Studio mittels spezieller Attribute soweit instruieren das es sich bestimmte Klassen in der Solution merkt und dir dann diese wieder zurück holen. (So macht es Microsoft selbst auch) Das klappt allerdings nur wenn die Klassen du die in der Auswahl anzeigen willst von einer bestimmten Basisklasse erben die du darauf vorbereitet hast. Für ein Nice-To-Have Feature aber sicher zuviel Aufwand.

3.511 Beiträge seit 2005
vor 9 Jahren

Meine WinForms Zeiten sind zwar schon etwas länger her, aber ich meine, dass man aus der Site der Komponente den IDesignerHost holen muss und dann via GetService auf die EnvDte zurückgreifen kann. Dann kann man sich wiederum das Interfaces IVsSolution abgreifen und per EnumProjects alle Projekte auslesen. Aber ich bin mir da nicht ganz sicher. Müsste man mal ausprobieren.

Gruß
Khalid

"Jedes Ding hat drei Seiten, eine positive, eine negative und eine komische." (Karl Valentin)