2013-06-20 60 views
1

還有一類創建一個泛型類的類型名稱

public class Repository <TKey, TEntity> 
{ 
    public ICollection<TEntity> Get() 
    { 
     using (var session = NHibernateHelper.OpenSession()) 
     { 
      if (typeof(TEntity).IsAssignableFrom(typeof(IActualizable))) 
       return session.CreateCriteria(typeof(TEntity)).Add(Restrictions.Lt("ActiveTo", DBService.GetServerTime())).List<TEntity>(); 

      return session.CreateCriteria(typeof(TEntity)).List<TEntity>(); 
     } 
    } 
} 

如何創建它,知道TEntity的唯一名字?

實施例:

類遊戲 { }

串nameEntity = 「遊戲」;

var repository = new Repository < long,???>();

+1

檢查此問題http://stackoverflow.com/questions/493490/converting-a-string-to-a-class-name –

+0

Type type = Type.GetType(entityName); 類型entity = typeof(DBCloud.Repositories.Repository <>)。MakeGenericType(new Type [] {type}); var rep = Activator.CreateInstance(entity); 錯誤\t 1使用泛型類型'Repository '需要2個類型參數 – ask125342

回答

2

有三個部分,以這樣的:

  • 從字符串"Game"
  • 創造了泛型實例
  • 做一些有用的事情與它得到Type

首先是相對容易,假設你知道更多 - 例如,Game是在一個特定的程序集和命名空間。如果你知道在組裝一些固定類型,你可以使用:

Type type = typeof(SomeKnownType).Assembly 
     .GetType("The.Namespace." + nameEntity); 

(並檢查它不會返回null

然後,我們需要創建泛型類型:

object repo = Activator.CreateInstance(
     typeof(Repository<,>).MakeGenericType(new[] {typeof(long), type})); 

但是請注意,這是object。如果有一個非泛型接口或基類,你可以用它來更方便Repository<,> - 我會把嚴重雖然加入一個!

使用,這裏最簡單的方法將是dynamic

dynamic dynamicRepo = repo; 
IList entities = dynamicRepo.Get(); 

,並使用非通用IList API。如果dynamic不是選項,則必須使用反射。

或者,添加非通用的API將使這微不足道:

interface IRepository { 
    IList Get(); 
} 
public class Repository <TKey, TEntity> : IRepository { 
    IList IRepository.Get() { 
     return Get(); 
    } 
    // your existing code here 
} 

那麼它就是:

var repo = (IRepository)Activator.CreateInstance(
     typeof(Repository<,>).MakeGenericType(new[] {typeof(long), type})); 
IList entities = repo.Get(); 

注:根據數據,IList可能無法正常工作 - 你可能需要替代爲非泛型IEnumerable

+0

不能將類型'System.Collections.Generic.ICollection '隱式轉換爲'System.Collections.IList'。存在明確的轉換(你是否缺少演員?) – ask125342

+0

對不起,它的工作,謝謝! – ask125342