C# 为类型名创建泛型类

C# 为类型名创建泛型类,c#,generics,C#,Generics,有一节课 public class Repository <TKey, TEntity> { public ICollection<TEntity> Get() { using (var session = NHibernateHelper.OpenSession()) { if (typeof(TEntity).IsAssignableFrom(typeof(IActualizable)))

有一节课

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>();
        }
    }
}
公共类存储库
{
公共ICollection Get()
{
使用(var session=NHibernateHelper.OpenSession())
{
if(typeof(tenty).IsAssignableFrom(typeof(iactuable)))
return session.CreateCriteria(typeof(tenty)).Add(Restrictions.Lt(“ActiveTo”,DBService.GetServerTime()).List();
return session.CreateCriteria(typeof(tenty)).List();
}
}
}
如何创造它,只知道tenty的名字

例如:

班级游戏 { }

string nameEntity=“游戏”


var repository=新存储库();

这有三个部分:

  • 从字符串
    “游戏”
  • 创建泛型实例
  • 用它做一些有用的事情
第一个是相对容易的,假设您知道多一点-例如,
Game
位于特定的程序集和命名空间中。如果您知道该程序集中的某个固定类型,则可以使用:

Type type = typeof(SomeKnownType).Assembly
      .GetType("The.Namespace." + nameEntity);
(并检查它是否返回
null

然后我们需要创建泛型类型:

object repo = Activator.CreateInstance(
      typeof(Repository<,>).MakeGenericType(new[] {typeof(long), type}));
并使用非通用的
IList
API。如果
dynamic
不是选项,则必须使用反射

或者,添加一个非通用API会使这变得微不足道:

interface IRepository {
    IList Get();
}
public class Repository <TKey, TEntity> : IRepository {
    IList IRepository.Get() {
        return Get();
    }
    // your existing code here
}
接口假定{
IList Get();
}
公共类存储库:IRepository{
IList IRepository.Get(){
返回Get();
}
//您的现有代码在这里
}
那么它只是:

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

注意:根据数据,
IList
可能不起作用-您可能需要转到非泛型的
IEnumerable

检查此问题Type=Type.GetType(entityName);Type entity=typeof(DBCloud.Repositories.Repository).MakeGenericType(新类型[]{Type});var rep=Activator.CreateInstance(实体);错误1使用泛型类型“Repository”需要2个类型参数不能将类型“System.Collections.generic.ICollection”隐式转换为“System.Collections.IList”。存在显式转换(是否缺少强制转换?)
var repo = (IRepository)Activator.CreateInstance(
      typeof(Repository<,>).MakeGenericType(new[] {typeof(long), type}));
IList entities = repo.Get();