2017-11-04 3 views
0

タイプTObjectを必要とするクラスにクラスタイプを動的に渡すことができるかどうか知りませんか?必要なクラスに動的タイプを渡す方法<TObject>

私のコントローラクラスは、次のように宣言されている:私は「TObjectのは、」いくつかの状況では、実行時にどうなるか分からないので、私は何かを行う方法があるかどうかを知りたい

public class DataController<TObject> where TObject : class 

私が下にしようとしているもののように?このコードはヒット時までに、私はタイプを知っているし、私がこのように、このメソッドに渡していた、「T」に保存されている:「t」は同じように使用される変数であるよう

 private void RefreshGrid(Type t, DataGridView ctl) 
    { 
     DataController<t> cDataController = new DataController<t>(); 

      //... other stuff 

     cDataController = null; 
    } 

はもちろん、ここでの構文は失敗します型、コンパイラは正式に私に教えてくれます。

事前に感謝します。

+1

あなたは 'RefreshGrid'ジェネリックも作成できませんか? ( 'private void RefreshGrid (DataGridView c)T:TObject') –

+0

あなたのご意見ありがとうございますが、どのように役立つか分かりません。 RefreshGridメソッドのタイプがであるかどうかは関係ありません。実際のオブジェクト(ではなく)のメソッド内でDataControllerをまだインスタンス化する必要があるためです。 –

+0

さて、あなたのコードがどのように機能するかについてもっと詳しく説明できますか?あなたの例では、 'RefreshGrid'がどこでどのように呼び出されていますか?あなたは実際のオブジェクトを渡すのではなく、型だけを渡しています。あなたは新しいインスタンスを作成したいですか?あなたは呼び出しコードを投稿できますか? –

答えて

0

私は、私は完全にあなたの質問を理解してわからないんだけど、あなたはオープンジェネリック型のインスタンスを作成したい場合、あなたはおそらく、あなたがあれば、より良いパフォーマンスと可読性を得ることができますActivator

private void RefreshGrid(Type t, DataGridView ctl) 
{ 
    var openGenericType = typeof(DataController<>); 
    var genericType = openGenericType.MakeGenericType(t); 
    var instance = Activator.CreateInstance(genericType); //Instance is type of DataController<T> where T is type of "t" 
    //If you need to access instance's members, you can use System.Reflection 
    //Other stuff... 

    instance = null; 
} 

を使用することによってそれを行うことができますあなたは達成したいことをより徹底的に指定します。

+0

私は、GUI内のさまざまなビューとそれらが接続されているデータベースエンティティ間のやりとりを制御するクラスを持っています。実際には、ビューごとに1つのクラスがあります。そこには、フォームにもデータベースエンティティ名、ビュー/フォーム名、およびDataGridView名があります。実際、私のクラスはこれらのクラスのリストにあります。私はすべてのビューをリフレッシュしたいが、個別にしたくないので、各クラスインスタンスで "foreach"を行い、 "Type"/EntityとGridをRefresh関数に送りたい。私はあなたの提案と多くの感謝をお試しいただきます。 –

+0

DataControllerにはDbContext型のパラメータが必要であることを忘れてしまいました。ありがとう。 –

+0

私は質問に多くの詳細を追加しました、多くのおかげで前に。 –

関連する問題