2010-09-19 63 views
3

所以我有這個類調用通過反射靜態類型初始化也許

public static class MyClass 
{ 
    static MyClass() 
    { 
     ... 
    } 
} 

其中有沒有方法,字段或屬性。它所做的就是將處理程序連接到其他地方定義的靜態事件。

由於Type初始值設定項永遠不會被調用,因爲靜態類永遠不會被實際訪問,所以事件不會被連接起來。

所以我希望能夠通過反射ala typeof(MyClass).TypeInitializer().Invoke(...)調用類型初始值設定項,但有個例外說明MyClass是一個抽象類。

最終,應用程序將有其他靜態類具有相同的業務規則格式。在將任何內容保存到數據庫之前,會觸發對應於正在保存的對象類型的靜態事件。因此,如果我想要做的事情最終不可能實現,那麼任何重構建議都必須遵循該結構。

編輯:

我可能不是很清楚的正是我試圖做的。基本上我有一個數據層,在這裏你可以初始化一個DataContext的實例,然後當SubmitChanges()被調用時,我檢查ChangeSet的插入/更新/刪除,併爲插入/更新/刪除的每種類型觸發靜態事件。這一切都很好,我只是在尋找一種方法,在應用程序啓動時連接事件處理程序。所以我用打是這樣的:

static DataContext() 
{ 
    System.Reflection.Assembly.GetExecutingAssembly().GetTypes() 
     .Where(t => t.Namespace == 'Data.Business') 
     .ToList() 
     .ForEach(t => { 
      // invoke the static TypeInitializer here, 
      // so that it can wire up it's event handlers. 
     }); 
} 

我可以用一個靜態Initialize方法,但由於這些應該永遠只能初始化一次,我在想TypeInitializer

編輯2:

我對MEF閱讀起來,這確實提供了一種方法做我想做的事。

+2

你有沒有想過,這只是一個非常糟糕/不可行的設計? – x0n 2010-09-19 20:06:55

+0

什麼是糟糕的設計?業務層?我應該把業務規則放在表示層嗎?還是你的意思是靜態的?我只是想,爲整個數據層註冊一組事件比爲每個數據上下文創建一組新事件更有效。 – 2010-09-19 20:24:57

回答

5

爲什麼不製作一個靜態方法,即Initialize(),它連接所有事件處理程序並調用MyClass.Initialize()?

+1

甚至是一個HelloWorld()方法。任何事情都會擊敗反思。 – 2010-09-19 20:03:25

+0

爲什麼人們如此反對反思?這將運行在一個類型初始值設定項中,所以性能命中可以忽略不計。 – 2010-09-20 13:20:07

+0

我不反對反思,但這是大多數事情的最後選擇。有一個單獨的初始化方法更簡單。在這種情況下,當你完全避免使用反射時,你會得到什麼?還有其他方法可以確保您的事件處理程序僅連接一次。 – 2010-09-20 13:46:56

5

可以使用RuntimeHelpers.RunClassConstructor方法運行靜態構造函數:

RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle); 

不過我強烈建議使用另一種方法來解決你的問題...理查德·海恩的建議似乎完全對我好。

0

進行以下校正代碼:

RuntimeHelpers.RunClassConstructor(typeof(MyClass).TypeHandle); 

希望這有助於!