C# 使用反射提取对象
使用反射时,可以提取对象或变量,无论是否C# 使用反射提取对象,c#,reflection,instance,information-extraction,C#,Reflection,Instance,Information Extraction,使用反射时,可以提取对象或变量,无论是否静态。比如说 class MainApp { static void Main() { ConcretePrototype1 p1 = new ConcretePrototype1("I"); ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone(); Console.WriteLine("Cloned: {0}",
静态。比如说
class MainApp
{
static void Main()
{
ConcretePrototype1 p1 = new ConcretePrototype1("I");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.WriteLine("Cloned: {0}", c1.Id);
}
}
可以提取吗
p1
和c1
都是,所以我可以检查它的类型
来自p1.clone()的方法调用
到目前为止,这是我对一个包含0个元素的结果数组所做的
我正在从其他文件加载程序集
var name = System.Reflection.Assembly.LoadFile(open.FileName);
name.GetType("PrototypePattern.MainApp").GetFields(BindingFlags.GetField|BindingFlags.Instance)
如果要提取所有字段(私有/公共/静态/非静态),请使用:
编辑
使用简单反射无法在方法内部获取变量和方法调用。这需要实际读取方法的字节码并进行分析——这不是一项容易的任务
如果您仍然对它感兴趣,我建议您查看诸如或之类的库。它不在同一程序集中。我正在从文件加载程序集。您不能使用反射访问局部变量。@HansPassant如果必须,可以使用什么方法提取?如果不采用复杂的方式使用微软的roslyn Etcy,你就会错过“做不到”的信息。调试器有一半的机会,当代码在发布模式下运行时没有。局部变量被抖动严重优化,将它们存储在cpu寄存器中是一个非常重要的速度改进。这意味着程序无法自行调试。Roslyn没有帮助,这是代码的编译器视图,而不是运行时视图。也许你错过的最重要的细节是局部变量存在的时间很短。当方法运行时,一只手最多只需几微秒。只有当你能够停止代码时,你才有希望看到它们的值。这个问题与信息提取无关。你应该去掉标签。我不想克隆我想返回对象p1
和c1
并调用p1。克隆()我编辑了我的答案。但你应该注意到,我提到的解决方案并不是微不足道的。也许您应该指定为什么需要这个,我们可以想出一个更简单的解决方案。我正在从程序集恢复设计模式,因此我需要验证客户端为名为X的ex类创建一个类实例的关系,并且我们必须看到有人创建类的实例X ins=new X()
并从中调用一个方法—某种类型的方法—来创建一个小视图—然后您需要Cecil或CCI。这些库允许您分析代码。
type.GetFields(BindingFlags.Static | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)