2011-07-22 118 views
4

在我的項目(.NET 3.5)我有很多的DAO是這樣的:(一爲每個實體)如何使用類型名稱實例化泛型類?

public class ProductDAO : AbstractDAO<Product> 
{...} 

我需要創建將接收DAO的名稱或實體名稱的函數(無論你認爲最好),並運行DAO「getAll()」函數。像這樣的代碼只適用於一個實體:

ProductDAO dao = new ProductDAO(); 
dao.getAll(); 

我是C#的新手,我該怎麼做反射?

成才這樣的:

String entityName = "Product"; 
AbstractDAO<?> dao = new AbstractDAO<entityName>() 
dao.getAll(); 

編輯

一個細節,我忘了,這是GETALL()如何返回:

IList<Product> products = productDao.getAll(); 

所以我還需要使用在名單上反思。怎麼樣?否則

Type entityType = typeof(Product); // you can look up the type name by string if you like as well, using `Type.GetType()` 
Type abstractDAOType = typeof(AbstractDAO<>).MakeGenericType(entityType); 
dynamic dao = Activator.CreateInstance(abstractDAOType); 
dao.getAll(); 

,只是做:

解決方案

Type daoType = typeof(AbstractDAO<>).Assembly.GetType("Entities.ProductDAO"); 
Object dao = Activator.CreateInstance(daoType); 
object list = dao.GetType().GetMethod("getAll").Invoke(dao, null); 

回答

6

如果使用仿製藥,不想實現爲每個實體類型的特定DAO,您可以使用此一個帶有DAO計算名稱的Type.GetType()(假設您遵循某個約定的名稱)。

+0

在'dao.getAll()',我感到我無法找到一個丟失的引用:'預定義類型「Microsoft.CSharp.RuntimeBinder.Binder」沒有定義或導入」我應該輸入什麼? – GxFlint

+0

爲了使'dynamic'正常工作,需要爲.NET 4編譯這些項目,並且需要引用「Microsoft.CSharp」和「System.Core」程序集。 – Lucero

+0

這是一個問題,而解決方案必須針對.NET 3.5。 因此,我不使用'dynamic',而是使用'Object'並用'dao.dao.GetType()。GetMethod(「getAll」)。調用(dao,null)'來調用它。但是在第一行中,'Type entityType = Type.GetType(「Entities.Product」);'返回null,'Entities'被引用。怎麼了? – GxFlint

2

嘗試:

Type d1 = typeof(AbstractDAO<>); 
Type[] typeArgs = {Type.GetType("ProductDAO")}; 
Type constructed = d1.MakeGenericType(typeArgs); 
object o = Activator.CreateInstance(constructed); 

o.GetType().GetMethod("getAll").Invoke();