2012-01-12 8 views
0

私はメソッド辞書は、テーブルの任意の量を持つことができますC#で未知の量の型をジェネリックメソッドに渡す方法はありますか?

void InitAndLoadTables(DbConnection cnctn, Dictionary<string, DbTableLoadParameters> tableNamesAndParameters) 

を持っています。すべての表はクラスに対応しています。

私はすべてのテーブルを反復処理するとき、私はすべてのテーブルのための一般的な方法

public void Init<T>(string tableName) 

呼び出すしたいと思います。 DbTableLoadParametersのプロパティになるクラスの型を

Type ObjectType { get; set; } 

とし、Initを呼び出すときに使用しました。これは動作しません。それで、それは可能ですか?テーブルの量が固定されている場合、おそらくInitAndLoadTablesを

InitAndLoadTables<T, K, V> 

のようにすることができます。だから、他の場所で

Init<Orders>("Orders"); 

おかげのよう& BR -Matti

+0

Iそれが存在するとは思わないが、代わりに 'Type'オブジェクト(または名前を持つ' string's)の配列/コレクションを渡す必要があるでしょう。誰かが他の人に提案できるものがある場合にのみコメントとして投稿してください。 –

+0

あなたの答えはありがたいですが、代わりに「代わりに型オブジェクト(または名前付きの文字列)の配列/コレクションを渡す必要があるでしょうか?それはまさに私がやろうとしていることです!それは動作しません。私が知っているのは、タイプオブジェクトまたは文字列オブジェクトを渡すことができないということです。タイプオブジェクトの名前は、汎用メソッドに値です。 –

答えて

4

ジェネリックメソッドは常に固定しているため、ジェネリックメソッドに型引数の任意の数を渡す方法はありませんが初期化を呼び出すための唯一の可能性があります型引数の数。

しかし、あなたはそれも必要ではないようです。そこランタイム知られているタイプのジェネリックメソッドを呼び出すための方法があるが、それはあなたが本当にをしている何のように、この音反射を伴う後:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myobj = new MyClass(); 

     // Call MyClass.Init<Orders> 
     CallMyClassInit(typeof(Orders), "tableOrders"); 

     // Call Init<string> 
     CallMyClassInit(typeof(string), "tableString"); 
    } 

    static void CallMyClassInit(MyClass obj, Type type, string tableName) 
    { 
     typeof(MyClass) 
      .GetMethod("Init") 
      .MakeGenericMethod(type) 
      .Invoke(obj, new object[] { tableName }); 
    } 
} 

class Orders { } 

class MyClass 
{ 
    public void Init<T>(string tableName) 
    { 
     Console.WriteLine("I was called with type " + typeof(T) + " for table " + tableName); 
    } 
} 

出力:

I was called with type ConsoleApplication1.Orders for table tableOrders 
I was called with type System.String for table tableString 
+0

ありがとう!これは私が恐れていたものです;)ちょっと試してみて、うまくいけばそれを受け入れてください。再度、感謝します! –

関連する問題