我試圖讓使用ILGenerator.Emit的ILGenerator的Emit:負載的PropertyInfo有
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;
}
}
這是我到目前爲止已經在做這IL代碼,並有一些併發症的方法參數:
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
System.String是由以下給出的屬性類型:pi.PropertyType;
我在做什麼錯?提前
你能提供完整的代碼和完全的例外? – thehennyy
什麼給你一個例外?哪裏? Emit幾乎不會檢查你在做什麼(它只是「寫入字節」),所以要確保你發出的是有意義的。它不會牽着你的手。並添加一個實際編譯和顯示您的問題的最小示例*,否則我們可以提供猜測。 – Luaan