簡體   English   中英

C#:反射:在以下位置創建Get類對象

[英]C#: Reflection: Get class object is created in

我正在研究如何獲取在另一個對象中創建的對象(或對象類型)。例如:

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。

謝謝!

否-該信息不會存儲在任何地方。 請注意,即使是這樣,它也很容易有效地過時。 例如:

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

現在應該顯示什么? 的當前值BObject.A_object 創建rootAObject ,但當前值rootAObject為空。 如果您希望將BObject顯示為“所有者”,那么您根本就不是在談論創建 ...並且在這一點上,您需要處理一個對象具有對其的多個引用的可能性。

請向我們提供有關大局的更多信息:您真正要解決的問題是什么?

我相信您正在尋找的是DeclaringType屬性,該屬性在您感興趣的System.Type實例上定義。請參閱DeclaringType文檔

DeclaringType僅會告訴您代碼模型的封閉類型,但是您所要做的是識別對象創建點。

除了讀取單個MethodBody IL外,沒有其他簡單的方法可以做到這一點。 用於創建對象的IL代碼是newobj。 要實現這一點,您需要為程序集中的每個方法讀取MethodBody,並標識包含newobj指令的方法,該指令的類型為您要遵循的對象類型的操作數。

通過使我的所有對象派生自帶有父參數的自定義對象來解決。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM