2013-06-20 41 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