【问题标题】:Accessing properties on System.Collections.Generic.List访问 System.Collections.Generic.List 上的属性
【发布时间】:2013-04-17 10:11:35
【问题描述】:

使用 Mono.Cecil 我可以遍历 System.Collections.Generic.List 上的字段(_items_size_version 等),但是如果我尝试使用它们,我总是获取异常

成员 'T[] System.Collections.Generic.List`1::_items' 在另一个中声明 模块,需要导入

对此我有两个问题:

  1. 不能访问泛型的底层字段吗?
  2. 如果可能,导入语句会是什么样子?

我已经成功访问​​了对象上的私有成员(只要它们不是编译器生成的),所以我假设 (1) 没问题。我也成功地导入了一些东西,尽管我承认我对导入的工作原理的理解是不稳定的(也就是“如果出现错误,请尝试导入它”)。

【问题讨论】:

  • 您能否提供一个简短但完整的失败示例?你能用普通反射而不是塞西尔来重现这个吗? (这会让其他人更容易复制。)
  • 不完全符合您的要求,但我已经在我的项目中创建了一个分支,您可以使用它通过git clone -b list_import --single-branch git@github.com:JesseBuesking/BB.DeepCopy.git 复制它。为要编织的 il 运行任何测试(测试将因此失败,因此您将能够在测试输出中看到错误)。今天我将尝试使用反射来重现这一点。
  • 后续:可以在ModuleWeaver.cs的第941行设置断点。从那里遍历代码将带您完成尝试访问列表对象上的字段的过程。

标签: c# mono mono.cecil


【解决方案1】:

在写入指向它的 IL 之前,您需要将 FieldDefinition 导入 ModuleDefinition。

所以在查看您的代码之后,它会是这样的。

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

我还注意到您还有另一个错误。当您在上面的代码中时,您已经丢失了类型参数的上下文。所以你试图在List&lt;T&gt; 上调用一些东西,而不是像List&lt;MyClass&gt; 这样的东西。但是如果你不能解决这个问题,你可以提出另一个 SO 问题:)

【讨论】:

  • 主要问题是我的AddI 分机不支持使用FieldReferences。我一直在解析FieldReference 以获得TypeDefinition 以便我可以通过它,这是不对的。嗬!我还发布了一个关于您在我的代码中指出的类型参数问题stackoverflow.com/q/16329710/435460
猜你喜欢
  • 2017-03-30
  • 1970-01-01
  • 2014-12-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 2019-07-05
  • 1970-01-01
  • 2015-11-03
相关资源
最近更新 更多