C#:Reflection:在中创建类对象

时间:2010-08-16 05:16:02

标签: 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() { }
    }

    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);
    }
}

其他信息: 这只是一个模拟我所拥有的大型项目的一部分的快速代码。问题是我有一个自定义类,在各种其他类中实例化很多地方。这个自定义类有一个函数应该能够调用它中的任何函数或实例化它的类中的任何函数。非常通用的处理,但需要。基本上我需要“。”的倒数。因此,对于objectA.objectB,我只需要通过将objectB传递给某个函数来找到objectA。

谢谢!

4 个答案:

答案 0 :(得分:1)

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

// Code as before
BObject.A_object = rootAObject;
rootAObject = null;
DoMethod(BObject.A_object);

现在应该显示什么? BObject.A_object的当前值已创建rootAObject,但rootAObject的当前值为空。如果您希望将BObject显示为“所有者”,那么您根本就不是在谈论创建 ......那时,您需要处理对象有多个引用的可能性。

请向我们提供更多有关大局的信息:您真正想解决的问题是什么?

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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