2009-04-15 19 views
1

.GetEvents()リターン配列をループし、ダイナミックタイプでイベントを実装しようとすると、インターフェイスを取っています。 TypeBuilder.CreateType()を呼び出そうとした時点で、この素敵なエラーが表示されます。イベントでダイナミック型のインターフェイスを実装する

"アセンブリからの型のアプリケーションメソッドがオーバーライドされたメソッドをオーバーライドしています。

私がコメントアウトした場合typeBuilder.DefineMethodOverrideは私がエラーを取得するイベントをサブスクライブしようとPOINで、インターフェイスメソッドを実装するために、その試みを呼び出します。

「メソッドまたは操作が実装されていません。 "

これは、検出されたイベントを放出されたタイプに追加しようとしている方法です。簡単なことに、タイプを定義しているメソッドを追加するコードがあります。これらのメソッドをインターフェイスに実装すると、そのコードはすべてうまく動作します。ミックスにイベントを追加しようとするまでは何の問題もありませんでした。

protected static void AddEvent(EventInfo interfaceEvent, TypeBuilder proxyBuilder) 
    { 
     // Event methods attributes 
     MethodAttributes eventMethodAttr = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Virtual | MethodAttributes.NewSlot | MethodAttributes.Final | MethodAttributes.SpecialName; 
     MethodImplAttributes eventMethodImpAtr = MethodImplAttributes.Managed | MethodImplAttributes.Synchronized; 

     string qualifiedEventName = string.Format("{0}.{1}", typeof(T).Name, interfaceEvent.Name); 
     string addMethodName = string.Format("add_{0}", interfaceEvent.Name); 
     string remMethodName = string.Format("remove_{0}", interfaceEvent.Name); 

     FieldBuilder eFieldBuilder = proxyBuilder.DefineField(qualifiedEventName, 
      interfaceEvent.EventHandlerType, FieldAttributes.Public); 

     EventBuilder eBuilder = proxyBuilder.DefineEvent(qualifiedEventName, EventAttributes.None, interfaceEvent.EventHandlerType); 

     // ADD method 
     MethodBuilder addMethodBuilder = proxyBuilder.DefineMethod(addMethodName, 
      eventMethodAttr, null, new Type[] { interfaceEvent.EventHandlerType }); 

     addMethodBuilder.SetImplementationFlags(eventMethodImpAtr); 

     // We need the 'Combine' method from the Delegate type 
     MethodInfo combineInfo = typeof(Delegate).GetMethod("Combine", new Type[] { typeof(Delegate), typeof(Delegate) }); 

     // Code generation 
     ILGenerator ilgen = addMethodBuilder.GetILGenerator(); 
     ilgen.Emit(OpCodes.Ldarg_0); 
     ilgen.Emit(OpCodes.Ldarg_0); 
     ilgen.Emit(OpCodes.Ldfld, eFieldBuilder); 
     ilgen.Emit(OpCodes.Ldarg_1);      
     ilgen.Emit(OpCodes.Call, combineInfo);    
     ilgen.Emit(OpCodes.Castclass, interfaceEvent.EventHandlerType);  
     ilgen.Emit(OpCodes.Stfld, eFieldBuilder); 
     ilgen.Emit(OpCodes.Ret); 

     // REMOVE method 
     MethodBuilder removeMethodBuilder = proxyBuilder.DefineMethod(remMethodName, 
      eventMethodAttr, null, new Type[] { interfaceEvent.EventHandlerType }); 
     removeMethodBuilder.SetImplementationFlags(eventMethodImpAtr); 

     MethodInfo removeInfo = typeof(Delegate).GetMethod("Remove", new Type[] { typeof(Delegate), typeof(Delegate) }); 

     // Code generation 
     ilgen = removeMethodBuilder.GetILGenerator(); 
     ilgen.Emit(OpCodes.Ldarg_0); 
     ilgen.Emit(OpCodes.Ldarg_0); 
     ilgen.Emit(OpCodes.Ldfld, eFieldBuilder);  
     ilgen.Emit(OpCodes.Ldarg_1);     
     ilgen.Emit(OpCodes.Call, removeInfo);    
     ilgen.Emit(OpCodes.Castclass, interfaceEvent.EventHandlerType); 
     ilgen.Emit(OpCodes.Stfld, eFieldBuilder); 
     ilgen.Emit(OpCodes.Ret); 

     // Finally, setting the AddOn and RemoveOn methods for our event 
     eBuilder.SetAddOnMethod(addMethodBuilder); 
     eBuilder.SetRemoveOnMethod(removeMethodBuilder); 

     // Implement the method from the interface 
     proxyBuilder.DefineMethodOverride(addMethodBuilder, typeof(T).GetMethod("add_" + interfaceEvent.Name)); 

     // Implement the method from the interface 
     proxyBuilder.DefineMethodOverride(removeMethodBuilder, typeof(T).GetMethod("remove_" + interfaceEvent.Name)); 

    } 

Googleは、と私はすべての朝これで苦労されている(ちょうどクリスタルの多くは、トピックをレポート返す「オーバーライドされたメソッドをオーバーライドしている」を検索)この上の0の助けとなっています。どんな助けでもが高く評価されます!

答えて

1

Nevermind。私はそれらの実装方法のインターフェイスをループするとき私は誤って追加/削除も実装しています。

私のループでこれを修正しました:if(method.IsSpecialName) continue;

関連する問題