2016-04-09 237 views
3

我想知道是否有辦法掛鉤到一個事件,每當一個對象被實例化。鉤到對象實例化

如果不存在,是否有辦法檢索屬性實例化時要附加到的對象?

我想要做的是給我的一些類的自定義屬性,每當具有此屬性的類被實例化時,爲它運行一些代碼。

當然,我可以簡單地將代碼放置在每個類的構造函數中,但這是大量的複製和粘貼,我很容易忘記將代碼複製到一個或兩個類中。當然,對於最終用戶來說非常方便,因爲他們所需要做的就是將我的屬性添加到他們的類中,而不用擔心記得在其構造函數中添加這些代碼。

我實際上不能做一個基類,因爲所有這些對象已經有一個基地。

在此先感謝。

下面是我想要做的一個例子。可以使用屬性的構造函數,也可以使用事件處理函數來實現對象實例化。

public class MySuperAttribute : Attribute 
{ 
    public MySuperAttribute() 
    { 
     //Something akin to this or the event in Global 
     Global.AddToList(this.TheTargetObject); 
    } 
} 
[MySuperAttribute] 
public class MyLabel : System.Windows.Forms.Label 
{ 
} 
public static class Global 
{ 
    public static void AddToList(Object obj) 
    { 
     //Add the object to a list 
    } 
    //Some pseudo-hook into the instantiation of any object from the assembly 
    private void Assembly_ObjectInstantiated(Object obj) 
    { 
     if(obj.GetType().GetCustomAttributes(typeof(MySuperAttribute), true).Count != 0) 
      AddtoList(obj); 
    } 
} 
+2

您正在尋找的術語是偵聽。如果你願意爲此付錢,PostSharp就可以做到。還有其他一些選項,我無法記住我的頭頂是免費的。他們要求每個攔截對象都是虛擬對象。 PostSharp不會。 http://doc.postsharp.net/location-interception – Brandon

+1

http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem – Eser

+0

@Brandon謝謝,我會研究它。 – Emilie217

回答

1

有沒有簡單的方法鉤住對象實例化在外部,也許有一些調試API,它有一個很好的理由。它讓你的代碼更難以維護和理解其他人。

屬性不起作用,因爲屬性的實例直到需要時纔會實際創建 - 通過反射,並將屬性分配給類型,而不是實例。

但是,您可能會將代碼放在基類中,並從中派生所有其他類,儘管將半初始化實例傳遞給其他方法也不是一個好習慣。如果類繼承自ContextBoundObject,則可以爲其分配ProxyAttribute的自定義實現,並覆蓋其上的所有操作。

如果您不能創建一個公共基類(當你的類型從不同類型的繼承),你總是可以像這樣一個自定義的方法創建實例:

public static T Create<T>() where T : new() 
{ 
    var inst = new T(); 
    Global.AddToList(inst); 
    return inst; 
} 

但是,看到你從窗體控件繼承,它們的實例可能由設計者控制。在這種情況下,恐怕沒有完美的解決方案。