2015-02-10 50 views
1

我有一個方法與此簽名IEnumerable的,T僅在運行時可用

public IEnumerable<T> GetAll<T>() where T : new() 
     { 
      // Orm Lite Version 
      return Connection.LoadSelect<T>(); 

     } 

在編譯的時候,我不知道是什麼類型T.我只知道在運行時類名是有可能調用這個方法使用類似這樣的反射?

string TargetTBLName = ...;//TargetTBLName get's it's value at runtime 
Type ParentTableClass = Type.GetType(TargetTBLName); 
IEnumerable<Type.GetType(TargetTBLName)> test = Repository.GetAll<Type.GetType(TargetTBLName)>(); 

任何想法?

回答

2

我想給一個Dynamitey庫去。你可以用很多不同的方式做到這一點,但我更喜歡這個,因爲它的簡單性。你可以找到它here

var name = InvokeMemberName.Create; 
var test = Dynamic.InvokeMember(Repository, name("GetAll", new[]{ParentTableClass })); 
foreach(var obj in test) 
{ 
    obj.SomeMethodFromMyType(); 
} 

請記住,如果Repository是靜態的,比你要調整它有點使用靜態調用上下文(查找鏈接)。

現在你有一個test對象,這是一個dynamic - 你可以用鴨子類型(這對速度也有一定的影響,例如)使用它,但一般你可以做任何你想做一個正常的IEnumerable<YourType>做。

如果你想使用反射:

MethodInfo getAll= typeof(Repository).GetMethod("GetAll"); 
MethodInfo getAllGeneric= getAll.MakeGenericMethod(ParentTableClass); 
object result = getAllGeneric.Invoke(this, null); 
      //or null, null is Repository is static 
var finalObject = result as IEnumerable; 

記住,因爲這是ParentTableClass編譯過程中一個未知的,你將無法訪問任何實際的類型提供 - 除非你使用dynamic方法。

+0

我猜這裏有一個錯字MethodInfo getAllGeneric = method.MakeGenericMethod(ParentTableClass); – 2015-02-10 15:30:34

+0

CCCV錯誤,現在修復。 – 2015-02-10 15:33:53

+0

我用你的第二種方法,它很好用。使用第一種方法有什麼優點和缺點? – 2015-02-11 11:57:38

相關問題