2

エンティティ フレームワークを使用してフォーム アプリを獲得しています。私の DbContext には、次の 2 つのインスタンスがあります。列。私のdataAccessレイヤーには、次のコードがあります

public static class DataLoader
{
    private static WdmEntities _context;

    public static List<T> GetTable<T>() where T : class
       {
           List<T> res = new List<T>();

           using (_context = new WdmEntities())
           {

               try
               {
                   res = _context.Set<T>().ToList();
               }
               catch
               {
               }
           }

           return res;
       }
}

Form.cs私は次のイベントハンドラーを持っています

availableTablesListBox.+= availableTablesListBox_SelectedIndexChanged;

void availableTablesListBox_SelectedIndexChanged(object sender, EventArgs e)
{
    //here i need to write code, that call GetTable<T> from DataLoader
    //according to the SelectedIndex of availableTablesListBox
}

しかし、私は書くことができます(真のジェネリックではありません)

if (availableTablesListBox.SelectedIndex == 1) 
     myDataGrid.DataSource = DataLoader.GetTable<tables>();
else 
     myDataGrid.DataSource = DataLoader.GetTable<columns>();

1行のコードを書きたい

myDataGrid.DataSource = DataTable.GetTable<WHAT WRITE HERE>();
4

2 に答える 2

1

次のようになります。

public static readonly MethodInfo getTableT = ((Func<List<object>>)DataLoader.GetTable<object>)
                                                   .Method
                                                   .GetGenericMethodDefinition();

(これらの行を使用するMethodInfoと、文字列を使用せGetTable<T>ずに、よりリファクタリングしやすくなります)

その後

Type[] types = new[] { typeof(tables), typeof(columns) };
myDataGrid.DataSource = getTableT.MakeGenericMethod(types[availableTablesListBox.SelectedIndex])
                                 .Invoke(null, null);

Gravellが言ったように、ジェネリックはコンパイル時に解決されるため、リフレクションなしでは実行時に新しいジェネリックを「構築」できないため、明らかにリフレクションを使用する必要があります。

于 2013-08-29T09:14:55.107 に答える