2010-12-15 5 views
0

Ich würde gerne einen Konstruktor für mein zur Laufzeit erstelltes Objekt erstellen, der eine Methode aufruft, die ein Objekt-Array aller Parameter annimmt, die an den ctor übergeben werden. Betrachtet man, wie ein solches Verfahren bauen es ich wie zu tun haben, etwas erscheint ::Wie definiere ich lokale Variablen in einem ConstructorBuilder?

method pulbic hidebysig specialname rtspecialname instance void .ctor(SomeObject arg) cil managed 
{ 
    ldarg.0 
    call void MyNameSpace.BaseClass::.ctor(); 
    ldc.i4.1 
    newarr System.Object 
    stloc.0 
    ldloc.0 
    ldc.i4.0 
    ldarg.1 
    stelem.ref 
    ldloc.0 
    call void SomeClass.Method(object[]) 
    ret 
} 

recht einfach, aber wie definiere ich eine lokale Variable vom Typ object[] auf dem Ctor Bauer? Es scheint keine Möglichkeit zu geben, Variablen zu definieren, oder gebe ich einfach eine stloc.0/ldloc.0 aus und kümmere mich nicht darum, sie zuerst zu definieren?

Antwort

2

Können Sie nicht GetILGenerator() aufrufen und dann verwenden, um eine lokale Variable mit ILGenerator.DeclareLocal zu deklarieren?

Zwar habe ich nicht versucht, irgendetwas davon verwenden, aber es klingt wie es der Weg zu gehen ist ...

+0

wow, wie zum Teufel habe ich das verpassen! Ich denke Ref.emit ist immer noch eine schrecklich heimliche ... –