Accessing properties on System.Collections.Generic.List

北战南征 提交于 2019-12-07 03:41:53

问题


Using Mono.Cecil I can iterate over the fields on System.Collections.Generic.List (_items, _size, _version, etc.), however if I try to use them I always get the exception

Member 'T[] System.Collections.Generic.List`1::_items' is declared in another module and needs to be imported

I have two questions regarding this:

  1. Is it not possible to access the underlying fields of the generics?
  2. If it is possible, what would the import statement look like for this?

I've successfully accessed private members on objects (as long as they're not compiler generated), so I'm assuming (1) is ok. I've also successfully imported things, although I admit my understanding of how the import is working is shaky (aka "if it gives an error, just try importing it").


回答1:


You need to import the FieldDefinition into the ModuleDefinition before writing IL that points to it.

So after looking at your code it would be something like this.

var fieldReference = ModuleDefinition.Import(field);
Action<Collection<Instruction>> load = collection => collection.AddI(OpCodes.Ldfld, fieldReference);

I also note that you have another bug. By the time you are in the above code you have lost the context of the type arguments. So you are trying to call something on List<T> instead of something like List<MyClass>. But you can raise another SO question if you cant solve that one :)



来源:https://stackoverflow.com/questions/16182174/accessing-properties-on-system-collections-generic-list

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!