在我的項目(.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);
在'dao.getAll()',我感到我無法找到一個丟失的引用:'預定義類型「Microsoft.CSharp.RuntimeBinder.Binder」沒有定義或導入」我應該輸入什麼? – GxFlint
爲了使'dynamic'正常工作,需要爲.NET 4編譯這些項目,並且需要引用「Microsoft.CSharp」和「System.Core」程序集。 – Lucero
這是一個問題,而解決方案必須針對.NET 3.5。 因此,我不使用'dynamic',而是使用'Object'並用'dao.dao.GetType()。GetMethod(「getAll」)。調用(dao,null)'來調用它。但是在第一行中,'Type entityType = Type.GetType(「Entities.Product」);'返回null,'Entities'被引用。怎麼了? – GxFlint