Ano*_*ous 8 c# reflection.emit
我正在使用动态程序集System.Reflection.Emit,我想定义一个模块级字段,可以检索的类型Module.GetField.有方法ModuleBuilder来定义全局的方法,但我能找到的唯一的东西看起来像一个" DefineGlobalField法"是DefineInitializedData和DefineUninitializedData,但对于这些我指定大小(或初始值,从它的大小可以推断),而不是一个类型.我怎样才能做到这一点?
经过一番筛选类的源代码后reflection.emit,我发现全局方法实际上是隐藏在接口TypeBuilder后面的ModuleBuilder。您确实不应该能够访问它,但是如果您通过反射获得它,您在其上定义的任何字段(和方法)都将成为模块全局(如果您尝试定义属性或事件,则不会出现错误)会被抛出,但据我所知,它们实际上并没有被定义)。这是一个有效的解决方案,但很明显你不应该这样做,所以如果有人想出更好的解决方案,请发布它。与此同时,这是它的代码:
var moduleData = myModule.GetType().GetField("m_moduleData", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(myModule);
var globalTypeBuilder = (TypeBuilder) moduleData.GetType().GetField("m_globalTypeBuilder", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(moduleData);
globalTypeBuilder.DefineField("myGlobalVar", typeof(int), FieldAttributes.Public | FieldAttributes.Static);
myModule.CreateGlobalFunctions();
Run Code Online (Sandbox Code Playgroud)
注意 a) 定义的任何字段或方法都globalTypeBuilder必须是静态的,b) 我可以说在 上定义方法而不是globalTypeBuilder仅仅使用没有任何优势Module.DefineGlobalMethod,c) 即使使用时globalTypeBuilder你仍然需要调用Module.CreateGlobalFunctions,无论是全局方法,全局字段,或两者兼而有之。
| 归档时间: |
|
| 查看次数: |
145 次 |
| 最近记录: |