0

作成したジェネリックメソッドを呼び出そうとしていますLoadItems<T>()。このメソッドはList<T>、データベースから返される一連のアイテムに対して一連の操作を実行します。

私が抱えている問題は、メソッドの呼び出しにありLoadItems<T>()ます。私が扱わなければならないのはオブジェクトだけです。このオブジェクトをTに解決して、メソッドを呼び出せるようにします。

説明の疑似的な方法で:

object theObject = GetTheObject();
LoadItems<GetGenericType(theObject)>();

これを行う方法はありますか?

トンありがとう

4

3 に答える 3

5

リフレクションを使用するか、デザインを変更する必要があります。

リフレクションを使用する場合、プロセスは複雑です。

// get the type of the object variable
var objType = theObject.GetType();

// I'm assuming that LoadItems() is a method in the current class
var selfType = GetType();

// you might need to use an overload of GetMethod() -- please read the documentation!
var methodInfo = selfType.GetMethod("LoadItems");

// this fills in the generic arguments
var genericMethodInfo = methodInfo.MakeGenericMethod(new[] { objType });

// this calls LoadItems<T>() with T filled in; I'm assuming it's a method on this class
var results = genericMethodInfo.Invoke(this, null);

resultsになりますのでご注意くださいobject。特定のList<>タイプにしたい場合は、運が悪いです。コンパイル時にタイプが何であるかはわかりません。これを非ジェネリックにキャストIListするか、LINQ式を使用して次のようなより便利なものに変換できます。

var niceResults = results.Cast<SomeBaseType>().ToList();

いつものように、何が起こっているのかわからない場合は、上記の関数に関するドキュメントを読んでください。

于 2013-02-07T04:58:30.513 に答える
2

はい、リフレクションを使用します:

MethodInfo mi = this.GetType().GetMethod("LoadItems").MakeGenericMethod(new Type[] { theObject.GetType() });

mi.Invoke(this, null);
于 2013-02-07T04:56:17.307 に答える
-1

一般的に使用するオブジェクトのタイプを取得するには

typeof(GetTheObject) 

また

theObject.GetType()

しかし、あなたはあなたがこのように機能することを定義するべきではありませんか?

    public void LoadItems<T>(T obj)
    {

    }

そして、このように呼んでいますか?

LoadItems(theObject);
于 2013-02-07T04:55:47.320 に答える