2008-11-06 10 views
13

Wir verwenden Microsoft.Practices.CompositeUI.EventBroker, um Ereignissubskription und -veröffentlichung in unserer Anwendung zu verarbeiten. Die Art und Weise, die funktioniert, ist, dass Sie ein Attribut zu Ihrem Ereignis hinzuzufügen, ein Thema Namen angeben, wie folgt aus:Wie füge ich einer Methode zur Laufzeit Attribute hinzu?

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

dann fügen Sie ein weiteres Attribut zu Ihrem Handler, mit dem gleichen Thema Namen, wie folgt aus:

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

Dann übergeben Sie Ihre Objekte an einen EventInspector, der alles zusammenbringt.

Wir müssen dies debuggen, also versuchen wir, eine Debug-Klasse zu erstellen, die alle die Ereignisse abonniert. Ich kann eine Liste aller Themennamen bekommen ... aber nur zur Laufzeit. Daher muss ich in der Lage sein, einer Methode zur Laufzeit Attribute hinzuzufügen, bevor wir unser Debug-Objekt an den EventInspector übergeben.

Wie füge ich einer Methode zur Laufzeit Attribute hinzu?

+0

By the way: bitte lassen Sie uns wissen, wie Sie es getan haben genau: D –

Antwort

9

Was Sie versuchen zu erreichen, ist ziemlich kompliziert, also werde ich versuchen, etwas zu liefern, nur um Ihnen zu beginnen. Dies ist, was ich glaube, Sie zu kombinieren, um müßten etwas zu erreichen:

  1. definieren eine abstrakte Klasse AbstractEventDebugger, mit einem Verfahren Search die mit allen von event Mitgliedern suchen, und registriert sie mit dem EventInspector. Definieren Sie auch eine Methode IdentifyEvent, mit der Sie das Ereignis, das es aufgerufen hat, identifizieren können (das hängt von Ihnen ab - welche Parameter haben, etc.).
  2. Definieren Sie eine dynamic type mit TypeBuilder (wie beschrieben here), die von Ihrer Klasse erbt. Diese Klasse wäre die Klasse Ihres Objekts debugger.
  3. Bringen Sie die Handlers Ihre Klasse Reflection.Emit.MethodBuilder (siehe here) verwenden, die die IdentifyEvent Methode aus der Klasse Mutter Aufruf werden und
  4. Reflection.Emit die Attribute auf dem Handler CustomAttributeBuilder Klasse (siehe here). Erstellen Sie eine Instanz Ihrer dynamic Klasse und senden Sie sie an den EventInspector.
  5. es Feuer :)

Here up ist ein Beispiel, wie ein Verfahren zu schaffen, die etwas nennt (Eigentlich ist es die klassische „Hallo Welt“).

Sie müssen viel tun, um es gut zu machen, aber Sie werden viel über Reflexion lernen.

Viel Glück!

+0

+1 für eine tatsächliche Lösung und nicht "Es kann nicht getan werden". Vielen Dank – Nuzzolilo

3

Attribute sind eine Kompilierzeit-Funktion (es sei denn, Sie haben mit ComponentModel zu tun - aber ich vermute, dass es Reflexion verwendet). Daher können Sie zur Laufzeit keine Attribute hinzufügen. Es wäre eine ähnliche Frage zu "Wie füge ich zur Laufzeit eine zusätzliche Methode zu einem Typ hinzu?". In regulären C#/.NET (vor DLR) können Sie nicht.

+0

Eigentlich kann es durch Mischen Dynamische Baugruppen und normale Baugruppen erfolgen. .NET 2.0 unterstützt diese und Sie müssen DLR nicht nur dafür verwenden. –

+3

@ Bogdan - aber das erlaubt immer noch nicht, Attribute zu einem bestehenden Typ/Mitglied hinzuzufügen. –

1

Sie müssen in die Welt der DynamicMethod eintauchen. Wie auch immer, da Sie MSIL brauchen, empfehle ich Ihnen wirklich, über Ihre Architektur nachzudenken.

+0

Vielleicht ist seine Architektur dynamisch und zielt darauf ab, Dienste zur Laufzeit mehreren Typen zur Verfügung zu stellen. Es ist nicht ungewöhnlich, und es wird tatsächlich empfohlen, wenn Sie ein modulares System haben möchten. –

1

Der EventInspector verwendet EventTopics (die im WorkItem gespeichert sind), um alle schweren Aufgaben zu erledigen. Jedes EventTopic Objekt hat Zugang zu einem Trace

Microsoft.Practices.CompositeUI.EventBroker.EventTopic genannt

, die Sie in Ihrer app.config-Datei wie folgt aktivieren:

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

Dies sollte viel machen nützliche Nachrichten werden in Visual Studio an Ihr Debug-Fenster weitergeleitet. Wenn Sie über das VS-Debug-Fenster hinausgehen möchten, haben Sie viele Möglichkeiten. Ich würde empfehlen, den folgenden Artikel heraus überprüfen:

Code Instrumentation with TraceSource My Persoanl Vade Mecum