2011-07-22 127 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();