C #: отражение: получить объект класса создан в - PullRequest
1 голос
/ 16 августа 2010

Я смотрю, как получить объект (или тип объекта), в котором создается другой объект. Например:

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 мне нужно найти objectA только от передачи в objectB какой-либо функции.

Спасибо!

Ответы [ 4 ]

1 голос
/ 16 августа 2010

Нет - эта информация нигде не хранится. Обратите внимание, что даже если бы это было так, это могло бы легко устареть, эффективно. Например:

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

Что это теперь должно показать? Текущее значение BObject.A_object было создано как rootAObject, но текущее значение rootAObject равно нулю. Если вы хотите, чтобы это показывало BObject как «владельца», тогда вы вообще не говорите о сотворении ... и в этот момент вам нужно иметь дело с возможностью того, что объект имеет несколько ссылок на него.

Пожалуйста, дайте нам больше информации об общей картине: какую проблему вы действительно пытаетесь решить?

0 голосов
/ 15 апреля 2011

Решено путем создания всех моих объектов из пользовательского объекта с родительским параметром.

0 голосов
/ 16 августа 2010

DeclaringType сообщит вам только тип включения модели кода, но вам нужно определить точку создания объекта.

Нет простого способа сделать это, кроме чтения отдельных MethodBody IL. IL-код для создания объекта - newobj. Чтобы реализовать это, вам нужно прочитать MethodBody для каждого метода в вашей сборке и определить метод, который содержит инструкцию newobj с операндом типа того типа объекта, который вам нужен.

0 голосов
/ 16 августа 2010

Я считаю, что вам нужно свойство DeclaringType, определенное в интересующем вас экземпляре System.Type. См. Документацию DeclaringType .

...