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:
Ist das möglich?
Bearbeiten - Aufgrund der bisherigen Antworten habe ich Folgendes versucht:
%Vor%aber diese Ausnahme erhalten:
%Vor%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:
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:
Ja. Es ist möglich. Siehe Reflection.Emit Namespace und TypeBuilders Methoden.
Tags und Links c# reflection generics runtime