2010-12-27 11 views
0

私はreflectionを使用してすべてのイベントを取得し、これらのイベントのいずれかに追加できる代理人を作成しようとしています。これまでのコードは です。ありがとうございます。さて、これは私にMicrosoft.Office.Interop.Word.ApplicationEvents4_DocumentBeforeSaveEventHandlerのEventInfoを与えるWord - Reflecting Events

EventInfo p = getEvent(this.Application, "DocumentBeforeSave"); 

public EventInfo getEvent(Word.Application wordApp, string eventName) 
    { 
     Type wordType = wordApp.GetType(); 

     EventInfo[] f = wordApp.GetType().GetEvents(); 
     EventInfo result = (from o in f 
       where o.Name == eventName 
       select o).FirstOrDefault(); 
     return result; 
    } 

まあアイデアは、ビットのような方法でこのようなDocumentBeforeSaveなどのイベントの名前を渡すことです。私には、Word.ApplicationEvents4_DocumentBeforePrintEventHandlerのようなものがあり、+ =;

EventInfoには、AddEventHandlerメソッドがあります。 DocumentBeforeSaveイベントが発生したときに私自身の代理人を付けて処理できることを願っています。

問題は、私はちょうどデリゲートの権利を得ることができないようです。私はこれで遊んでいます:

MethodInfo[] myArrayMethodInfo = msw.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); 
      MethodInfo r = (from o in myArrayMethodInfo 
        where o.Name == "add_" + p.Name 
        select o).FirstOrDefault(); 

Delegate del = Delegate.CreateDelegate(p.EventHandlerType,r, false); 

しかし、代議員は常にnullです。これは可能ではないのですか、それとも間違っていますか?

おかげ

+0

「msw」とは – SLaks

+0

mswは次のように定義されています。Word.Application ms =(Word.Application)this.Application; タイプmsw = ms.GetType(); –

+0

これはCOMイベントです。彼らは異なった働きをします。また、加算メソッドのデリゲートを作成しても良いことはありません。さらに、それは加算器の間違ったデリゲート型です。 'Action 'が必要です。 – SLaks

答えて

0

あなたはExpression Treeを作成することができます。

この機能を使用すると、実行時に任意のデリゲート型にコードをコンパイルできます。

+0

こんにちは、私は表現木の経験はありませんが、状況をもう少し明確にして、私が達成しようとしていることを見てほしいと願っています。ありがとう –

+0

@user:あなたは表現木でいくつかの経験を得る必要があります。任意のパラメータを持つ任意のデリゲートメソッドを作成する最も簡単な方法です。 ILGeneratorを使用することもできますが、それははるかに難しいです。 – SLaks

+0

あなたは状況をまったく明らかにしていません。 – SLaks