2008-11-06 68 views
13

我們使用Microsoft.Practices.CompositeUI.EventBroker來處理應用程序中的事件訂閱和發佈。該工作方式是添加一個屬性到你的事件,指定主題名稱,如:如何在運行時將屬性添加到方法?

[EventPublication("example", PublicationScope.Global)] 
public event EventHandler Example; 

那麼你添加另一個屬性到您的處理,與同一主題的名稱,如:

[EventSubscription("example", ThreadOption.Publisher)] 
public void OnExample(object sender, EventArgs e) 
{ 
    ... 
} 

然後您將您的對象傳遞給EventInspector,它將所有內容匹配起來。

我們需要調試這個,所以我們試圖創建一個調試類,訂閱所有事件。我可以獲得所有主題名稱的列表......但只能在運行時。因此,在我們將調試對象傳遞給EventInspector之前,我需要能夠在運行時爲方法添加屬性。

如何在運行時向方法添加屬性?

+0

順便說一句:請讓我們知道你是怎麼做到這一點正是:d – 2008-11-07 11:18:06

回答

9

你想要達到的是相當複雜的,所以我會盡量提供一些東西來幫助你開始。這是我認爲你需要,以實現的東西結合起來:

  1. 定義的抽象類AbstractEventDebugger,有一種方法Search,搜索所有event成員,並與EventInspector註冊它們。此外,定義一個方法IdentifyEvent,這將允許您識別調用它的事件(這取決於您 - 參數將會有哪些等)。
  2. 使用TypeBuilder(如描述的here)定義dynamic type,該類繼承自類。這個類將是你的debugger對象的類。
  3. 使用Reflection.Emit.MethodBuilder(見here),這將調用父類的方法IdentifyEvent
  4. Reflection.Emit使用CustomAttributeBuilder類(見here)處理程序的屬性附加的處理程序上您的課。
  5. 創建dynamic類的實例並將其發送到EventInspector。
  6. 火起來:)

Here是如何創建一個調用的東西(其實它是經典的「Hello world」)的方法的樣本。

你需要做很多調整才能完成它,但是你會學到很多關於反射的知識。

祝你好運!

3

屬性是一個編譯時功能(除非您正在處理ComponentModel - 但我懷疑它是使用反射)。因此,您不能在運行時添加屬性。這與「如何在運行時向類型添加額外方法?」類似的問題。在常規的C#/ .NET(pre-DLR)中,你不能。

+0

實際上,它可以通過混合動力組件和正常組件來完成。 .NET 2.0支持它們,你不需要爲此使用DLR。 – 2008-11-06 12:58:35

+3

@Bogdan - 但仍然不允許你添加屬性到現有的類型/成員。 – 2008-11-14 09:32:02

1

您需要深入研究DynamicMethod的世界。然而,當你需要知道MSIL時,我真的建議你認真思考你的架構。

+0

也許他的架構是動態的,目的是在運行時爲多種類型提供服務。這種情況並不少見,如果你想擁有一個模塊化系統,實際上建議這樣做。 – 2008-11-06 13:01:16

1

EventInspector使用EventTopics(存儲在WorkItem中)來完成所有繁重工作。每個EventTopic對象訪問一個名爲TraceSource

Microsoft.Practices.CompositeUI.EventBroker.EventTopic

,你可以在你的app.config文件使這樣的:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
     <switches> 
      <add name="Microsoft.Practices.CompositeUI.EventBroker.EventTopic" value="All" /> 
     </switches> 
    </system.diagnostics> 
</configuration> 

這應該使大量有用的消息會被路由到Visual Studio中的調試窗口。如果你想超越VS調試窗口,你有很多選擇。我建議你檢查出下面的文章:

Code Instrumentation with TraceSource My Persoanl Vade Mecum

相關問題