2017-04-03 7 views
1

DataTableからDbDataAdapterを使用してデータベーステーブルを塗りつぶしたコードがあります。VS2015でのリフレクションによるイベントへのバインドができません

DbProviderFactory.CreateDataAdapterメソッドによって作成されます。DbProviderFactoryは、Devart dotConnectです。
Oracle、SqlServer、Postgres用のDevartのドライバを使用します。

私はDataTableにほぼ100k行を持っているので、残念なことに一般的なインターフェイスで定義されていないRowUpdatedイベントにバインドする必要があります(残念ながら、上記のすべてのデータベースドライバで利用できます)。

は、したがって、私は、このコードにリフレクションを経由して、それをバインドします

Dim eventInfo As System.Reflection.EventInfo = adapter.GetType().GetEvent("RowUpdated") 
eventInfo.AddEventHandler(adapter, [Delegate].CreateDelegate(eventInfo.EventHandlerType, 
          (Sub(s As Object, e As EventArgs) UpdateProgress(s, e)).Method)) 

このVS2013でコンパイルしたが、失敗した場合に完全に動作し、実行時にこの例外に、ロスリン(VS2015)でコンパイルされた場合:

シグネチャまたはセキュリティの透過性がデリゲートタイプのものと互換性がないため、ターゲットメソッドにバインドできません

これに関する助力?

eの種類としてDevart.Data.PostgreSql.PgSqlRowUpdatedEventHandler(私は現在Postgresにあります)を使用していません。

+0

は、それがハンドラ内でDevart.Data.PostgreSql.PgSqlRowUpdatedEventArgs'として、電子 'で動作しますか? – djv

+0

@djv ouch!イベント引数の代わりにイベントハンドラを使用しました!私は明日にしよう! – Teejay

+0

@djv私はDbTypeをテストして特定のイベントを使用しなければならないので、明白な正しい方法を試してみます。 – Teejay

答えて

0

@djvのコメントに投稿されたthis answerから始まり、最終的には犯人になります。

Roslyn(VS2015)では、イベントハンドラをバインドする前にDelegateを明示的に宣言する必要があるようです。

例えば、私の場合、私は記述する必要があります。

Public Delegate Sub RowUpdatedEventHandler(sender As Object, e As RowUpdatedEventArgs) 

そして:

Dim eventInfo As System.Reflection.EventInfo = adpt.GetType().GetEvent("RowUpdated") 
eventInfo.AddEventHandler(adpt, [Delegate].CreateDelegate(eventInfo.EventHandlerType, 
          DirectCast(AddressOf UpdateProgress, RowUpdatedEventHandler).Method)) 

また、それはラムダといくつかの問題を持っているようです。たとえば、この動作しません。

Dim eventInfo As System.Reflection.EventInfo = adpt.GetType().GetEvent("RowUpdated") 
eventInfo.AddEventHandler(adpt, [Delegate].CreateDelegate(eventInfo.EventHandlerType, 
          DirectCast((Sub(s As Object, e As RowUpdatedEventArgs) UpdateProgress(s, e)), RowUpdatedEventHandler).Method)) 

(とやラムダ式のDirectCastなし)

関連する問題