Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.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#:反射:在中创建Get类对象_C#_Reflection_Class_Outer Join - Fatal编程技术网

C#:反射:在中创建Get类对象

C#:反射:在中创建Get类对象,c#,reflection,class,outer-join,C#,Reflection,Class,Outer Join,我正在研究如何获取在其中创建另一个对象的对象(或对象类型)。例如: public class RootClass { public class A { public void MethodFromA() { } } public class B { public A A_object = new A(); public void MethodFromB() { }

我正在研究如何获取在其中创建另一个对象的对象(或对象类型)。例如:

public class RootClass
{
    public class A
    {
        public void MethodFromA()
        {

        }
    }

    public class B
    {
        public A A_object = new A();
        public void MethodFromB() { }
    }

    B BObject = new B();
    A rootAObject = new A();

    public void DoMethod(A anA_object)
    {

    }

    main()
    {
        /* Somehow through reflection
         * get the instance of BObject 
         * of type B from only the info
         * given in anA_object or at
         * the very least just know that
         * anA_object was created in
         * class B and not root. */
        DoMethod(BObject.A_object);

        /* Same as above except know that
         * this A object came from root 
         * and is not from B class */
        DoMethod(rootAObject);
    }
}
// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);
其他信息:
这只是一个模拟我拥有的一个大型项目的一部分的快速代码。问题是我有一个自定义类,它在许多其他类的许多地方实例化。这个自定义类有一个函数,它应该能够调用其中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。基本上我需要“.”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来查找objectA


谢谢

我相信您要查找的是您感兴趣的
System.Type
实例上定义的属性
DeclaringType
。请参阅。

我相信您要查找的是您感兴趣的
System.Type
实例上定义的属性
DeclaringType
。请参阅。

否-此信息不会存储在任何位置。请注意,即使是这样,它也很容易变得过时。例如:

public class RootClass
{
    public class A
    {
        public void MethodFromA()
        {

        }
    }

    public class B
    {
        public A A_object = new A();
        public void MethodFromB() { }
    }

    B BObject = new B();
    A rootAObject = new A();

    public void DoMethod(A anA_object)
    {

    }

    main()
    {
        /* Somehow through reflection
         * get the instance of BObject 
         * of type B from only the info
         * given in anA_object or at
         * the very least just know that
         * anA_object was created in
         * class B and not root. */
        DoMethod(BObject.A_object);

        /* Same as above except know that
         * this A object came from root 
         * and is not from B class */
        DoMethod(rootAObject);
    }
}
// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);
现在应该显示什么?
bobObject的当前值。一个_对象
被创建为
rootAObject
,但
rootAObject
的当前值为空。如果你想让它显示为“所有者”,那么你根本就不是在谈论创造。。。在这一点上,您需要处理一个对象有多个引用的可能性


请给我们更多关于全局的信息:您真正想解决的问题是什么?

否-此信息不会存储在任何地方。请注意,即使是这样,它也很容易变得过时。例如:

public class RootClass
{
    public class A
    {
        public void MethodFromA()
        {

        }
    }

    public class B
    {
        public A A_object = new A();
        public void MethodFromB() { }
    }

    B BObject = new B();
    A rootAObject = new A();

    public void DoMethod(A anA_object)
    {

    }

    main()
    {
        /* Somehow through reflection
         * get the instance of BObject 
         * of type B from only the info
         * given in anA_object or at
         * the very least just know that
         * anA_object was created in
         * class B and not root. */
        DoMethod(BObject.A_object);

        /* Same as above except know that
         * this A object came from root 
         * and is not from B class */
        DoMethod(rootAObject);
    }
}
// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);
现在应该显示什么?
bobObject的当前值。一个_对象
被创建为
rootAObject
,但
rootAObject
的当前值为空。如果你想让它显示为“所有者”,那么你根本就不是在谈论创造。。。在这一点上,您需要处理一个对象有多个引用的可能性


请给我们提供更多关于全局的信息:您真正想要解决的问题是什么?

DeclaringType将只告诉您代码模型的封闭类型,但您需要的是识别对象创建点


除了阅读单独的MethodBody IL之外,没有简单的方法可以做到这一点。用于创建对象的IL代码是newobj。要实现这一点,您需要读取程序集中每个方法的MethodBody,并识别包含newobj指令的方法,其类型操作数为您所追求的对象类型。

DeclaringType将只告诉您代码模型的封闭类型,但您所追求的是识别对象创建点


除了阅读单独的MethodBody IL之外,没有简单的方法可以做到这一点。用于创建对象的IL代码是newobj。为此,,您将需要读取程序集中每个方法的MethodBody,并识别包含newobj指令的方法,该指令的类型操作数为您所追求的对象类型。

通过使所有我的对象从具有父参数的自定义对象派生来解决。

通过使所有我的对象从具有父参数的自定义对象派生来解决父参数。

这看起来您已经得到了您认为是解决方案的一部分,并且正在请求帮助解决不可能的部分。您试图解决的实际问题是什么?如果可能的话,它将不是通过反射,而是像堆栈跟踪一样的运行时诊断。反射只是为了反射类元数据,而不是实例。此外,虽然我同意@Anon的观点,但这个问题本身就很有趣。这只是一个模拟我拥有的大型项目的一部分的快速代码。问题是我有一个自定义类,它在许多其他类的许多地方实例化。这个自定义类有一个函数,它应该能够调用其中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。我需要“.”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来查找objectA。这看起来您已经得到了您认为是解决方案的一部分,并且正在就不可能的部分寻求帮助。您试图解决的实际问题是什么?如果可能的话,它将不是通过反射,而是像堆栈跟踪一样的运行时诊断。反射只是为了反射类元数据,而不是实例。此外,虽然我同意@Anon的观点,但这个问题本身就很有趣。这只是一个模拟我拥有的大型项目的一部分的快速代码。问题是我有一个自定义类,它在许多其他类的许多地方实例化。这个自定义类有一个函数,它应该能够调用其中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。我需要“.”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来查找objectA。不,我认为这与这里的问题无关。所讨论的两个对象具有相同的类型。。。但是这些实例是由不同类型的调用创建的。不,我不认为这与这里的问题有任何关系。所讨论的两个对象具有相同的类型。。。但实例是由不同类型的调用创建的。