Как создать универсальный класс, используя его имя типа - PullRequest
4 голосов
/ 22 июля 2011

В моем проекте (.NET 3.5) я получил много DAO, таких как: (по одному на каждую сущность)

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

Мне нужно создать функцию, которая получит имя DAO или имяего сущности (что вы считаете лучшим) и запустите функцию getAll () DAO.Как этот код делает только для одной сущности:

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 ]

6 голосов
/ 22 июля 2011

Если вы используете дженерики и не хотите реализовывать конкретный 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();

В противном случае просто выполните Type.GetType() с вычисленным именем DAO (при условии, что вы соблюдаете определенное соглашение для имен).

3 голосов
/ 22 июля 2011

Попробуйте:

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

o.GetType().GetMethod("getAll").Invoke();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...