我有一个界面
public interface IFetchData<TEntity>
{
IEnumerable<TEntity> GetItems();
}
两个类继承自此接口FetchFromDatabase
和FetchFromCollection
。目的是在注入到另一个类的类之间切换,让我们在屏幕上显示它们等。根据使用的类型,我想根据类型从特定集合中获取数据。在FetchFromDatabase
中实现此功能不是问题,因为DbContext
具有返回特定表的方法DbContext.Set<>()
。
我正在寻找使用集合来实现它的方法。在第23行的FetchFromCollection
:return modules.Set();
中,编译器报告错误:
错误2无法隐式转换类型'System.Collections.Generic.IEnumerable&lt; MainProgram.Models.Module&gt;'到'System.Collections.Generic.IEnumerable&lt; TEntity&gt;'。存在显式转换(您是否错过了演员?)
我不知道如何将Module
类转换为泛型类型TEntity
。我试图使用中间类ModelBase
并继承到具体的定义,但后来我必须使用另一个注入级别,并由我自己决定使用哪个具体类。
我在这里找到了一些Pass An Instantiated System.Type as a Type Parameter for a Generic Class,这是使用反射的方式。我仍然很困惑如何实现这一目标。有什么建议吗?
FetchFromDatabase
public class FetchFromDatabase<TEntity> : IFetchData<TEntity>
where TEntity : class
{
private readonly MainDBContextBase context;
public FetchFromDatabase(MainDBContextBase context)
{
if (context == null)
throw new ArgumentNullException("DB context");
this.context = context;
}
public IEnumerable<TEntity> GetItems()
{
return context.Set<TEntity>();
}
}
FetchFromCollection
public class FetchFromCollection<TEntity> : IFetchData<TEntity>
where TEntity : class
{
private readonly InitializeComponents components;
private ModelModules modules;
private ModelSpecializations specializations;
private ModelTeachers techers;
private ModelStudents students;
public FetchFromCollection(InitializeComponents components)
{
if (components == null)
throw new ArgumentNullException("Context");
this.components = components;
}
public IEnumerable<TEntity> GetItems()
{
if (typeof(TEntity) == typeof(Module))
{
if (modules == null)
modules = new ModelModules(components);
return modules.Set();
}
return null;
}
}
答案 0 :(得分:1)
您是否尝试过显式演员?
return (IEnumerable<TEntity>)modules.Set();