私はVS 2010(.Net 4.0)でEF 4.3.1を使用して、データベースから複数の参照テーブルをロードし、 WinFormsアプリケーション。強くReflection .GetValue()オブジェクトを汎用DbSetにキャスト
フォームのロード時に、ローカルに格納されるようにデータをプリフェッチしています。ローカルデータをコントロールにバインドするために使用できるBindingSourceオブジェクトの辞書を作成しています。その目的は、フォームをより高速にロードし、UIの応答性を向上させるために、EFの自己検証がコールドクエリに与える影響を最小限に抑えることです。
私は次のように与えられたDbSet収集のためのBindingSourceオブジェクトを作成し、取得するためにコードを書いている:このコードは動作します
Private _dictBindings As New Dictionary(Of String, BindingSource)
Private Sub ValidateBinding(Of T As Class)(ByRef DbCollection As DbSet(Of T))
Dim strClassName As String = DbCollection.[GetType]().GetGenericArguments(0).Name
If Not _dictBindings.ContainsKey(strClassName) Then
_dictBindings.Add(strClassName, New BindingSource With {.DataSource = DbCollection.Local.ToBindingList})
End If
End Sub
Public Function GetBinding(Of T As Class)(ByRef DbCollection As DbSet(Of T)) As BindingSource
ValidateBinding(Of T)(DbCollection)
Return _dictBindings(DbCollection.[GetType]().GetGenericArguments(0).Name)
End Function
、と私は
ValidateBinding(Db.ProvinceStates)
または
を呼び出すことができますComboBox1.DataSource = GetBinding(Db.Cities)
ただし、起動時にモデル内のすべてのDbSetコレクションでValidateBindingを呼び出す必要があります私は現在66テーブルを読み込んでおり、後で追加することができるので、リフレクションを使用してコンテキスト内の利用可能なコレクションを反復したいと思います。
私は、次のコードを書いている:
For Each propSet As PropertyInfo In Db.GetType.GetProperties(BindingFlags.Instance Or BindingFlags.Public).Where(Function(P) P.PropertyType.IsGenericType)
ValidateBinding(propSet.GetValue(Db, Nothing))
Next
を...しかし、それはpropSet.GetValueとして機能しません()の代わりに(Tの)DbSetのオブジェクトを返します。私はまた、リフレクションを通して型を知っていても、オブジェクトを適切な型のDbSetにキャストできません。
私はC#Dynamic型にアクセスすることはできませんが、リフレクションとジェネリックスを混在させるのは難しいことですが、反射DbSetを関数に渡すことができる解決策がありますか?おそらく何かMethod.Invokeを使用して?