Ich versuche, diesen Code in IL zu machen mit ILGenerator.EmitILGenerator Emit: Lastproperty hat Methodenparameter
class Foo
{
...
}
public class TestClass
{
public static void test()
{
Type t = typeof(Foo);
foreach(PropertyInfo p in t.GetProperties())
{
GenerateVar(p.PropertyInfo);
}
}
public static object GenerateVar(Type var)
{
if (var == typeof(Int32))
{
return 5;
}
else if (var == typeof(Char))
{
return 'a';
}
return null;
}
}
Dies ist, was ich bisher getan, und hatte einige Komplikationen :
MethodInfo mi = TestClass.GetType().GetMethod("GenerateVar",
BindingFlags.Public |
BindingFlags.Instance);
ILGenerator generator = mb.GetILGenerator();
LocalBuilder propertyType;
LocalBuilder TestClass = mb_gen.DeclareLocal(typeof(TestClass));
foreach (PropertyInfo pi in t.GetProperties())
{
propertyType = mb_gen.DeclareLocal(pi.PropertyType);
//loads into the stack the current PropertyType and the method class
generator.Emit(OpCodes.Ldloc, TestClass);
generator.Emit(OpCodes.LdLoc, propertyType);
//calls GenerateVar(Type var) to get a PropertyType var
generator.Emit(OpCodes.Callvirt, mi);
}
Es gibt mir die folgende Ausnahme: ->erwarteten Typ: System.Type, Empfangene Typ: System.String
System.String ist der angegebene Eigenschaftstyp: pi.PropertyType;
Was mache ich falsch?
Vielen Dank im Voraus
Können Sie Ihren vollständigen Code bereitstellen und die vollständige Ausnahme? – thehennyy
Was gibt Ihnen eine Ausnahme? Woher? Emit macht so gut wie keine Kontrolle darüber, was Sie tun (es schreibt nur "Bytes"), also stellen Sie sicher, dass das, was Sie aussenden, Sinn macht. Es wird deine Hand nicht halten. Und fügen Sie ein minimales Beispiel * hinzu, das Ihr Problem * tatsächlich kompiliert und anzeigt, andernfalls können wir nur Vermutungen anbieten. – Luaan