【问题标题】:Extract objects using Reflection使用反射提取对象
【发布时间】:2012-05-27 17:21:02
【问题描述】:

在使用反射时,无论static 与否,都可以提取对象或变量。例如

class MainApp
{
    static void Main()
    {            
        ConcretePrototype1 p1 = new ConcretePrototype1("I");
        ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
        Console.WriteLine("Cloned: {0}", c1.Id);
    }
}

是否可以提取

  1. p1c1 都可以检查它的类型

  2. 来自 p1.clone() 的方法调用

到目前为止,这就是我对包含 0 个元素的结果数组所做的工作

我正在从其他文件加载程序集

var name = System.Reflection.Assembly.LoadFile(open.FileName);
name.GetType("PrototypePattern.MainApp").GetFields(BindingFlags.GetField|BindingFlags.Instance)

【问题讨论】:

  • 它不在同一个程序集中。我正在从文件中加载程序集。
  • 不能使用反射访问局部变量。
  • @HansPassant 如果必须,可以使用哪些方法来提取?无需使用 roslyn by microsoft 等复杂的方法
  • 您错过了“做不到”的消息。调试器有一半的机会,当代码在发布模式下运行时没有。局部变量被抖动严重优化,将它们存储在 cpu 寄存器中是一个非常重要的速度改进。那和程序不能自己调试。 Roslyn 没有帮助,那是代码的编译器视图,而不是运行时视图。也许您错过的最重要的细节是局部变量的生存时间很短。当方法运行时,充其量是一手微秒。只有当您可以停止代码时,您才有希望看到它们的值。
  • 本题与信息提取无关。您应该删除标签。 en.wikipedia.org/wiki/Information_extraction

标签: c# reflection instance information-extraction


【解决方案1】:

如果您想提取所有字段(私有/公共/静态/非静态),请使用:

type.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)

编辑

你不能使用简单的反射来获取变量和方法调用inside方法。这需要实际读取方法的字节码并对其进行分析——这不是一件容易的事。

如果您仍然热衷于此,我建议您查看诸如 Mono.CecilCCI 之类的库。

【讨论】:

  • 我不想克隆我想检索对象 p1c1 并调用 p1.clone()
  • 我编辑了我的答案。但是您应该注意,我提到的解决方案并非微不足道。也许您应该指定为什么您需要这个,我们可以想出一个更简单的解决方案。
  • 我正在从程序集中恢复设计模式,因此我需要验证客户端为名为 X 的前类创建类实例的关系,我们必须看到有人创建了类 @987654326 的实例@ 并从中调用一个方法来制作一个小视图
  • 那么 Cecil 或 CCI 就是您所需要的。这些库允许您分析代码。
猜你喜欢
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-15
相关资源
最近更新 更多