2

我有一個方法,即根據一些I型傳入的參數,這樣檢索到我一些數據:動態傳遞類型的方法<T>

protected void FillList<TEntity>() 
    { 
     doWorkForTEntity(); 
    } 

我需要動態地調用這個方法:

  Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes(); 
      Type currentEntity = (from entity in entities 
            where entity.Name.Equals(this.targetEntity) 
            select entity).FirstOrDefault(); 
      FillList<currentEntity>(); 

我得到這個錯誤:

類型或命名空間名稱「currentEntity」找不到(你米西納克using指令或程序集引用?)

我嘗試一箇中間對象類型,沒有成功

任何想法好嗎?

+0

本示例代碼非常奇怪,您如何期待「爲泛型類型工作」? (或者這只是一個簡單的例子..?) – Izzy 2013-05-02 13:11:47

回答

2

由於沒有有關在編譯時的實體類型的信息,你需要構建和反射調用適當的方法:

Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes(); 
Type currentEntity = (from entity in entities 
         where entity.Name.Equals(this.targetEntity) 
         select entity).FirstOrDefault();  
var method = this.GetType().GetMethod("FillList", BindingFlags.Instance | BindingFlags.NonPublic) 
          .MakeGenericMethod(currentEntity); 
method.Invoke(this, new object[0]); 
1

你需要做的是與反思爲好,這樣就不會在編譯時失敗(編譯器檢查):

泛型類:

Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes(); 
Type currentEntity = (from entity in entities 
          where entity.Name.Equals(this.targetEntity) 
          select entity).FirstOrDefault(); 
Type fillListType= typeof(FillList<>); 
Type constructedGenericClass = fillListType.MakeGenericType(currentEntity); 
object myList = Activator.CreateInstance(constructedGenericClass); 

泛型方法:

Type[] entities = System.Reflection.Assembly.GetAssembly(typeof(User)).GetTypes(); 
Type currentEntity = (from entity in entities 
          where entity.Name.Equals(this.targetEntity) 
          select entity).FirstOrDefault(); 
MethodInfo methodinfo = this.GetType().GetMethod("FillList"); 
MethodInfo genericMethod = method.MakeGenericMethod(currentEntity); 
genericMethod.Invoke(this, null); 
0

類型參數必須在編譯時指定,不能在運行時分配時間就像你的例子。你會得到錯誤信息,因爲沒有類型叫做currentEntiry,因爲它只是一個變量。

0

改變你的方法取類型TEntity的一個實例:

protected void FillList<TEntity>(TEntity instance) 
{ 
    doWorkForTEntity(); 
} 

從型號名稱創建一個動態的實例,然後調用修改的方法:

dynamic instance = Activator.CreateInstance(this.targetEntity); 
FillList(instance); 

動態類型基本上正在做其他答案已經顯示給你 - 但恕我直言,這個代碼更乾淨,更清晰的意圖。