2013-02-07 25 views
0

我想調用一個我創建的通用方法LoadItems<T>()。該方法對從數據庫返回的項目執行一堆操作。有沒有辦法通過定義對象的T來調用方法<T>()?

我的問題是在調用LoadItems<T>()方法。我所要做的就是一個對象。我想將此對象解析爲T,以便我可以調用我的方法。

在解釋的僞方式:

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

有沒有辦法做到這一點?

由於一噸

+1

很容易通過反思。這裏也曾多次提到過這個問題。 – leppie

+2

@leppie:但爲什麼傳遞簡單的代表點呢? – siride

+0

@siride:它看起來像我需要更多的代表? ; p(在那裏,有一些) – leppie

回答

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(); 

與往常一樣,閱讀我上面列出,如果你不是活得功能的文檔確定發生了什麼事。

+0

現貨,欣賞幫助 –

-1

要獲得類型的對象,你會經常使用

typeof(GetTheObject) 

theObject.GetType() 

但你不應該來定義你的作用也是這樣嗎?

public void LoadItems<T>(T obj) 
    { 

    } 

並稱它是這樣的?

LoadItems(theObject); 
+1

不知道這是如何涵蓋這個問題的。你忘了完成你的答案嗎? – leppie

+0

「並且這樣稱呼它?」 - 不,這不是OP的調用方式。如果那是真的,這將是非常容易的,OP可能不會問。 – siride

+0

啊誤會了 – shenku

2

是,使用反射:

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

mi.Invoke(this, null); 
+0

我不會那樣做的。但它的工作。 – JosephHirn

相關問題