如何使用其类型名称实例化泛型类?

时间:2011-07-22 14:36:34

标签: c# reflection .net-3.5

在我的项目(.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 daoType = typeof(AbstractDAO<>).Assembly.GetType("Entities.ProductDAO");
Object dao = Activator.CreateInstance(daoType);
object list = dao.GetType().GetMethod("getAll").Invoke(dao, null);

2 个答案:

答案 0 :(得分:6)

如果您使用的是泛型,并且不想为每种实体类型实现特定的DAO,则可以使用:

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();

否则,只需使用DAO的计算名称执行Type.GetType()(假设您遵循某些约定的名称)。

答案 1 :(得分:3)

尝试:

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

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