根据类型

时间:2015-10-03 13:00:01

标签: c# generics

我有一个界面

public interface IFetchData<TEntity>
{
    IEnumerable<TEntity> GetItems();
}

两个类继承自此接口FetchFromDatabaseFetchFromCollection。目的是在注入到另一个类的类之间切换,让我们在屏幕上显示它们等。根据使用的类型,我想根据类型从特定集合中获取数据。在FetchFromDatabase中实现此功能不是问题,因为DbContext具有返回特定表的方法DbContext.Set<>()

我正在寻找使用集合来实现它的方法。在第23行的FetchFromCollectionreturn 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;
    }
}

1 个答案:

答案 0 :(得分:1)

您是否尝试过显式演员?

return (IEnumerable<TEntity>)modules.Set();