我想調用一個我創建的通用方法LoadItems<T>()
。該方法對從數據庫返回的項目執行一堆操作。有沒有辦法通過定義對象的T來調用方法<T>()?
我的問題是在調用LoadItems<T>()
方法。我所要做的就是一個對象。我想將此對象解析爲T,以便我可以調用我的方法。
在解釋的僞方式:
object theObject = GetTheObject();
LoadItems<GetGenericType(theObject)>();
有沒有辦法做到這一點?
由於一噸
我想調用一個我創建的通用方法LoadItems<T>()
。該方法對從數據庫返回的項目執行一堆操作。有沒有辦法通過定義對象的T來調用方法<T>()?
我的問題是在調用LoadItems<T>()
方法。我所要做的就是一個對象。我想將此對象解析爲T,以便我可以調用我的方法。
在解釋的僞方式:
object theObject = GetTheObject();
LoadItems<GetGenericType(theObject)>();
有沒有辦法做到這一點?
由於一噸
你將不得不使用反射或改變設計。
如果你想使用反射,工藝複雜:
// 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();
與往常一樣,閱讀我上面列出,如果你不是活得功能的文檔確定發生了什麼事。
現貨,欣賞幫助 –
是,使用反射:
MethodInfo mi = this.GetType().GetMethod("LoadItems").MakeGenericMethod(new Type[] { theObject.GetType() });
mi.Invoke(this, null);
我不會那樣做的。但它的工作。 – JosephHirn
很容易通過反思。這裏也曾多次提到過這個問題。 – leppie
@leppie:但爲什麼傳遞簡單的代表點呢? – siride
@siride:它看起來像我需要更多的代表? ; p(在那裏,有一些) – leppie