【发布时间】:2016-11-30 14:07:44
【问题描述】:
我正在尝试使用 ILGenerator.Emit
在 IL 中编写此代码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;
}
}
这是我迄今为止所做的,并且有一些并发症:
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);
}
它给了我以下例外: -> 预期类型:System.Type,接收类型:System.String
System.String 是由以下给出的属性类型:pi.PropertyType;
我做错了什么?
提前致谢
【问题讨论】:
-
你能提供你的完整代码和完整的异常吗?
-
什么给了你一个例外?在哪里? Emit 几乎不会检查您正在做什么(它只是“写入字节”),因此请确保您发出的内容是有意义的。它不会牵你的手。并添加一个实际编译并显示您的问题的最小示例,否则我们只能提供猜测。
标签: c# .net cil reflection.emit propertyinfo