Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用反射提取对象_C#_Reflection_Instance_Information Extraction - Fatal编程技术网

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)