2012-03-27 17 views
0

Ich habe eine Lösung, die zwei Projekte enthält. Zunächst möchte ich mein Szenario beschreiben. Projekt 1: hält eine Basisklasse ruft MyBaseClass mit den beiden folgenden Eigenschaften und Methoden, die ich interessiert bin:Activator.CreateInstance mit geerbter Klasse nicht im selben Projekt

TypeToLoad - statische String-Eigenschaft, welche Klasse mit einfachen get/set-Funktionalität zu instanziiert geerbt.

Instanz - statische Eigenschaft, die eine MyBaseClass Instanz des Typs in TypeToLoad mit den folgenden Zeilen Code angegeben zurückgibt:

im zweiten Projekt
public static MyBaseClass Instance{ 
    return (MyBaseClass)Activator.CreateInstance(Type.typeof(TypeToLoad)); 
} 

jetzt natürlich richtige Namespace und Referenzen, die ich erben MyBaseClass wie folgt (von wurde hinzugefügt).

public class MyInheritClass : MyBaseClass { 
    //implements all other functions of MyBaseClass; 
} 

und einer meiner anderen Code-Datei im selben Projekt wie MyInheritClass, habe ich folgende Zeilen Code:

Type myType = Type.typeof("MyInheritClass"); //returns the correct "Type" 
MyBaseClass.TypeToLoad = "MyInheritClass"; 
MyBaseClass myInstance = MyBaseClass.Instance; //Errors... because Type.typeof(...) could not resolve "MyInheritClass". 

Wenn ich MyInheritClass Code-Datei in das gleiche Projekt wie MyBaseClass bewegen die Code läuft gut.

Meine Frage ist, gibt es sowieso zu erstellen und Instanz von MyInheritClass mit MyBaseClass.Instance MyBaseClass.TypeToLoad = "MyInheritClass" ohne diese beiden Klassen im selben Projekt (MyBaseClass in der Basis-DLL-Klassenbibliothek und MyInheritClass in einem anderen Projekt, das auf MyBaseclass-DLL-Bibliothek verweist)?

Ich habe versucht, nach Reflexionen zu suchen, Activator war aber nicht in der Lage zu finden, was ich suchte. Vielleicht kenne ich die richtige Terminologie dafür nicht.

+1

BTW, sollten Sie wirklich beschreibende Tags wie [tag: .net] oder [tag: C#] verwenden.Wenn Sie das tun würden, würden Sie wahrscheinlich viel früher eine Antwort bekommen. – svick

Antwort

2

Sie tatsächlich Type.GetType() bedeuten Unter der Annahme (und nicht Type.typeof(), die nicht kompiliert werden), dann ist es, wie genau das tun, klar dokumentiert, was Sie beobachten:

Die Assembly qualifizierten Namen des Typs zu erhalten . [...] Wenn sich der Typ in der gerade ausgeführten Assembly oder in Mscorlib.dll befindet, ist es ausreichend, den Typnamen anzugeben, der durch seinen Namespace qualifiziert ist.

Es wird auch erläutert, wie Sie es beheben können: Geben Sie den Namen der Baugruppe an den Typnamen an. Also, wenn Ihr Typ in MyInheritClass genannt wird, ist es in dem MyNamespace Namespace und in MyAssembly Anordnung (in der Regel des gleiches wie der Projektname), könnten Sie die Typnamen zu

MyNamespace.MyInheritClass, MyAssembly 

gesetzt und es sollte funktionieren.

Auch sollten Sie vermeiden, Strings für Typnamen zu verwenden, mit den tatsächlichen Type Objekte ist viel sicherer. TypeToLoad sollte vom Typ Type sein, nicht string.

Oder vielleicht sollten Sie ein Design wie dieses überhaupt nicht verwenden. Ich weiß nicht, warum tust du das, aber ich bin mir ziemlich sicher, dass es eine bessere Lösung gibt, die das Setzen statischer Felder auf einer Basisklasse wie dieser nicht beinhaltet. (Was passiert, wenn Sie zwei Typen haben, die dieselbe Basisklasse implementieren?)

+0

Hallo svick, sind Sie absolut richtig über meine mistke von typeing Type.TypeOf() anstelle von Type.GetType(). – NPToita

+0

Der Zweck von mir in dieser Richtung ist, dass, weil ich eine Reihe von Anbietern habe, die meine Basis/Kern mit Standardfunktionalität wäre. Und für jeden Client, den ich habe, würde ich diese Provider nach Bedarf erben und ihre virtuellen Methoden überschreiben, wo immer sie gebraucht werden, und in einer Konfigurationsdatei den Provider-Typ auf die richtige Kunden-Provider-Klasse verweisen. Und ich möchte nicht alle Kunden in derselben Baugruppe bündeln, da es keinen Sinn macht, die Bibliothek von Kunde A auch den Code von Kunde B enthalten zu lassen. – NPToita

+0

Stellen Sie sich vor, wenn die Anzahl der Clients auf 100+ steigt, wäre es die Hölle, den Code zu verwalten. Durch in dieser direkten gehen, es gibt mir die Möglichkeit, jeden Client-Provider separat auf ihr eigenes Projekt zu entwickeln und Dump nur die DLL in ihre Client-Anwendung und zeigt den Anbieter über die Klasse zu Client. etwas Ähnliches wie die Mitgliedschaft Provider. Vielen Dank für Ihre Lösung/Vorschlag. Ich werde es auf jeden Fall versuchen und werde Feedback geben. Ich bin ziemlich ein anderer Körper dort hat auch das gleiche Problem, das ich habe. Noch einmal, vielen Dank. Thinh P. Nguyen – NPToita

Verwandte Themen