Erstelle den Typ "MyClass: OtherClassMyClass {}" zur Laufzeit?

9

Ist es in C # möglich, zur Laufzeit einen Typ zu erstellen, der von einer generischen Klasse erbt, in der der Template-Parameter für die Basisklasse die aktuelle Klasse ist? Dies wird gut kompilieren:

%Vor%

aber ich bin mir nicht sicher, wie ich MyClass mit System.Reflection.Emit.ModuleBuilder.TypeBuilder erstellen kann:

%Vor%

Ist das möglich?

Bearbeiten - Aufgrund der bisherigen Antworten habe ich Folgendes versucht:

%Vor%

aber diese Ausnahme erhalten:

%Vor%     
wes 07.11.2012, 19:05
quelle

3 Antworten

7

Bearbeiten: Hier ist meine letzte funktionierende Antwort:

%Vor%

Der Trick besteht darin, SetParent mit einem parametrisierten generischen Typ aufzurufen, der Parameter ist der Typbuilder des Typs, der selbst konstruiert wird.

Verwenden Sie den TypeBuilder.SetParent (Type Eltern) Methode.

Seien Sie vorsichtig bei der Verwendung, das Auswerfen von Ausnahmen wird auf CreateType call:

verschoben
  

Wenn parent null ist, wird Object als Basistyp verwendet.

     

In den .NET Framework-Versionen 1.0 und 1.1 wird keine Ausnahme ausgelöst, wenn parent ein Schnittstellentyp ist, aber TypeLoadException wird ausgelöst, wenn die CreateType-Methode aufgerufen wird.

     

Die SetParent-Methode prüft nicht auf die meisten ungültigen übergeordneten Typen. Beispielsweise wird ein übergeordneter Typ, der keinen Standardkonstruktor hat, nicht zurückgewiesen, wenn der aktuelle Typ über einen Standardkonstruktor verfügt, versiegelte Typen nicht abgelehnt werden und der Delegattyp nicht zurückgewiesen wird. In allen diesen Fällen werden Ausnahmen von der CreateType-Methode ausgelöst.

Um Ihren generischen Typ OtherClass<T> zu erstellen, verwenden Sie die MakeGenericType -Methode:

%Vor%     
gracchus 07.11.2012, 19:16
quelle
2

Sie können den Basistyp danach festlegen.

TypeBuilder.SetParent (Typ)

    
leppie 07.11.2012 19:08
quelle
1

Ja. Es ist möglich. Siehe Reflection.Emit Namespace und TypeBuilders Methoden.

    
Dmitry Martovoi 07.11.2012 19:09
quelle

Tags und Links