2013-06-10 15 views
7
[Name("Admin")] 
public class TestAdmin : TestUserBase<TestAdmin> 
{ 
    public TestAdmin(Type webDriverType) : base(webDriverType) 
    { 
    } 
} 

Derzeit habe ich eine Reihe von Klassen dieses Formulars, die ich zur Laufzeit mit Reflection.Emit erstellen möchte. Aber ich laufe in ein Problem, wenn ich versuche, die Eltern fügen - da die Testadmin Klasse existiert nicht vor der Laufzeit, ich weiß nicht, wieVerwendung des emittierten Typs als Typparameter in Reflection.Emit

TestUserBase<TestAdmin> 

Irgendwelche Ideen zu schaffen?

TypeBuilder tb = mb.DefineType("TestAdmin", TypeAttributes.Public); 
tb.SetParent(typeof(TestUserBase<>).MakeGenericType(tb)); 

Type theType = tb.CreateType(); 
+0

Haben Sie Probleme speziell, weil das Argument für die grundlegende generische Klasse * diese * Klasse ist? –

+0

Ich glaube, Sie haben ein Huhn und Ei Problem ... Der C# -Compiler kann dies tun, weil es wahrscheinlich nicht Reflection.Emit verwendet, um die IL zu generieren. Ich bin mir nicht sicher, ob es eine Lösung für dieses Problem gibt ... –

+0

Hat make-generic-method den Typ-Builder? Aber tatsächlich erinnere ich mich an einige dornige Hühner-/Ei-Bereiche, mit denen ich Probleme habe. In letzter Zeit verwende ich IKVM-Reflexion, die die gleiche api wie Reflexion hat, aber die viele dieser Bereiche behebt –

Antwort

7

Sie können den übergeordneten Typ SetParent mit eingestellt. Ich konnte das nicht gründlich testen, aber ich denke, das ist möglich. Probieren Sie etwas wie folgt aus:

Angenommen, Ihre generische Basisklasse ist bereits definiert (dh, du bist nicht zu erzeugen TestUserBase<T>), sollten Sie in der Lage sein, so etwas zu tun:

var emittedType = module.DefineType("TestAdmin", TypeAttributes.Public | TypeAttributes.Class); 
var baseType = typeof(TestUserBase<>).MakeGenericType(type); 
emittedType.SetParent(baseType); 

Natürlich, wenn TestUserBase<T> Wird generiert, können Sie dieselbe Logik verwenden, die MakeGenericType auf dem dynamischen Typ TestUserBase<T> verwendet. Die SetParent Logik ist die gleiche.

+0

Super, danke! Das sieht genau so aus, wie ich es brauche. –

3

OK:

Verwandte Themen