Kann ich eine variable deklarieren, die vom Typ<T> ohne Angabe von T zur compile-Zeit?
Wie lade ich die Klasse "MyContent" dynamisch ?
Ich habe 1 interface<T>
, 1 abstract generic class<T>
und 1. Klasse. Check mein code aus:
public interface IMyObjectInterface{
}
public abstract MyAbstractObject : IMyObjectInterface{
}
public class MyObject : MyAbstractObject{
}
public interface IMyContentInterface<T> where T : MyAbstractObject
{
void MyMethod();
}
public abstract MyAbstractContent<T>, IMyContentInterface<T> where T : MyAbstractObject
{
public abstract void MyMethod();
}
public public class MyContent : MyAbstractContent<MyObject>
{
public override void MyMethod() { //do something }
}
Ich versuche aber offensichtlich funktioniert es nicht:
IMyObjectInterface obj = (IMyObjectInterface)Assembly.Load("MyAssembly").CreateInstance("MyObject");
IMyContentInterface<obj> content = (IMyContentInterface<obj>)Assembly.Load("MyAssembly").CreateInstance("MyContent");
content.MyMethod();
//assembly and type names are correct
Wenn ich IMyContentInterface<obj>
zu IMyContentInterface<MyObject>
funktioniert :
IMyContentInterface<MyObject> content = (IMyContentInterface<MyObject>)Assembly.Load("MyAssembly").CreateInstance("MyContent");
content.MyMethod();
//assembly and type names are correct
Das problem ist, dass ich weiß nicht, was ist mein Objekt in der 2. Zeile, bei der Definition IMyContentInterface<T>
. Bitte, weiß jemand, wie es zu tun in .NET Framework 4.0?
- Fettformatierung dein text macht es viel ärgerlicher und weniger gut lesbar. Unbolded ist die Standardeinstellung für einen Grund.
- Zusätzlich, es sei denn Sie flüchten in Klammern den text, wie der generic-Parameter, Sie werden ausgeblendet, wenn Leistungen, die in diesem Fall Ihre Frage sehr schwer zu verstehen.
- möglich, Duplikat der Ruft die generische Methode mit Typ-argument bekannt ist, nur bei der Ausführung
Du musst angemeldet sein, um einen Kommentar abzugeben.
den Artikel in der
< >
hat einen Typ, nicht ein Objekt.mein Auto ist ein Objekt vom Typ Auto, so
ich möchte eine Liste, um meine Autos (Objekte vom Typ Auto) in.
Und dann fügen wir Objekt vom Typ Auto auf meiner Liste.
Laden es ist nicht schwer - Sie wissen bereits, wie zu tun, aber C# - generics sind stark typisiert, überprüft und garantiert zur compile-Zeit. Betrachten Sie diesen code:
Den C# - compiler konnte nicht sagen, das war illegal, wenn Sie zugelassen wurden, zu erklären, Generika, wie dieses:
Wenn Ihr Ziel ist zu nennen
MyContent.MyMethod()
und das hat nichts zu tun mit dem generischen Typ-parameter<T>
betrachten Sie deklarieren eine nicht-generische Schnittstelle, die Sie implementieren können, irgendwo in der Vererbungshierarchie und erklären Sie Ihre Instanz-Variablen verwenden, die:Ich Lesen musste das ein paar mal, aber ich habe herausgefunden, was Sie gefragt haben. 🙂 Diese Frage ist eine bestimmte Instanz dieser anderen Frage:
Dieser sagte, hier ist ein Beispiel, wie Sie vielleicht verwenden Sie es für Ihre test-Fall. Natürlich können Sie variieren. Verpassen Sie auch nicht meine Letzte Anmerkung am Ende dieser Antwort.
Montage MyCompany.MyProduct.MyComponent:
Definieren Ihre Schnittstellen in dieser Versammlung:
Montage MyCompany.MyProduct.MyComponent.Umsetzung:
Implementieren die Schnittstellen, die in dieser Versammlung werden die dynamisch geladen werden.
Montage MyCompany.MyProduct
Ihr Programm ist komponiert in dieser Versammlung, ein Begriff, den ich zog aus der Managed Extensibility Framework. Diese assembly-Referenzen
MyCompany.MyProduct.MyComponent
aber nichtMyCompany.MyProduct.MyComponent.Implementation
unter der Annahme, dass die Schnittstellen sind eher zu bleiben kompatibel als die Implementierungen während der Produkt-Entwicklung. Dieser Entwurf ist ein Versuch, zu Gunsten zusammenhalt über Kupplung (ein paar der oft missverstandene Wörter), aber die eigentlichen Implementierungen neigen dazu, variieren stark in Ihren Erfolg, dieses Ziel zu erreichen.Letzte Anmerkung:
Den Managed Extensibility Framework gebaut wurde, als eine gemeinsame Lösung für das problem arbeiten. Nachdem er mit ihm für eine Weile jetzt, ich mit zuversicht sagen, dass es hat die folgenden netten Eigenschaften:
Ich würde einfach empfehlen, es als ernsthafte option für jemanden an einer neuen Anwendung arbeiten, wenn Sie auf eine beliebige Kombination von einem oder mehr der folgenden:
Dies ist ein Weg, um dynamisch geladen, eine Schnittstelle. Dies setzt Voraus, Sie haben einige Weg, um die assembly, die Sie versuchen, es zu laden und eine Zeichenfolge für den Namen des Typs.
In meinem Fall habe ich eine Xml-Datei. Sie können jede verwenden, ich don ' T zeigen diese Methoden, weil es ändern können gemäß Ihrer Umsetzung.