dav*_*v_i 9 c# cil reflection.emit
我只是花了几个小时被一个NullReferenceException我认为不应该有的地方弄糊涂了.我正在构建一个类似的类:
public class MyClass : MyBase<Foo>
{
public MyClass()
{
base.Method(Foo.StaticField);
}
}
Run Code Online (Sandbox Code Playgroud)
哪里
public class MyBase<T>
{
private SomeObject bar = new SomeObject();
public void Method(object o)
{
this.bar.AnotherMethod(o); // exception thrown here
}
}
Run Code Online (Sandbox Code Playgroud)
基本上我的IL如下:
ctorIl.Emit(OpCodes.Ldarg_0);
ctorIl.Emit(OpCodes.Ldsfld, staticField);
ctorIl.Emit(OpCodes.Box, typeof(FieldType));
ctorIl.Emit(OpCodes.Call, parentMethod);
ctorIl.Emit(OpCodes.Ret);
Run Code Online (Sandbox Code Playgroud)
我终于想到它一定bar是没有被实例化的.我在C#中构建了我的类并编译它,发现唯一的区别是以下应该高于上面的IL:
ctorIl.Emit(OpCodes.Ldarg_0);
ctorIl.Emit(OpCodes.Call, parentCtor);
// as above
Run Code Online (Sandbox Code Playgroud)
使用这些行,我的代码现在可以按预期工作.
所以我的问题是:
请注意,您实际上可以在单个方法中发出一个简单的构造函数(包括基本调用):
typeBuilder.DefineDefaultConstructor();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
229 次 |
| 最近记录: |