0

我的代码:

public class MyClass
{
    private WdmEntities _context;

    public List<T> GetTable<T>()
    {
        List<T> res = new List<T>();
        _context = new DbEntities();

        if (typeof(T) == typeof(tables))
            res = _context.tables.ToList();//error cannot implicitly convert type
        if (typeof(T) == typeof(columns))
            res = _context.columns.ToList();//error cannot implicitly convert type

        return res;
    }

}

我有来自EntityModel的表和列类型

但我得到了编译错误:

 cannot implicitly convert type

我必须如何更改我的代码才能使其工作?

4

3 回答 3

5

您需要转换每个项目:

public class MyClass
{
    private WdmEntities _context;

    public List<T> GetTable<T>()
    {
        List<T> res = new List<T>();
        _context = new DbEntities();
        if (typeof(T) == typeof(tables))

            // If the defined entity type is an abstract class or interface
            // while the returned type from the dbcontext really is of your object type
            res = _context.tables.Cast<T>().ToList();
        if (typeof(T) == typeof(columns))
            res = _context.columns.Cast<T>().ToList();

        return res;
    }

}

或者只是集合:

public class MyClass
{
    private WdmEntities _context;

    public List<T> GetTable<T>()
    {
        List<T> res = new List<T>();
        _context = new DbEntities();
        if (typeof(T) == typeof(tables))

            //Just casting the returned list, if the entity type is the same as T
            res = (List<T>)_context.tables.ToList();
        if (typeof(T) == typeof(columns))
            res = (List<T>)_context.columns.ToList();

        return res;
    }

}

...取决于您的上下文是如何创建的。

于 2013-08-28T11:23:28.193 回答
5

在这样的一行中:

    if (typeof(T) == typeof(tables))
        res = _context.tables.ToList();

编译器不会试图理解这个if测试如何影响赋值规则;就它而言,您正在尝试分配List<table>给 a List<T>,这是不行的,因为编译器不相信您table=== T

您可以通过使用强制转换来强制它:

    if (typeof(T) == typeof(tables))
        res = (List<T>)(object)_context.tables.ToList();

但是,您可能想检查您_context是否有通用 API。例如,在 LINQ-to-SQL 中:

res = _context.GetTable<T>().ToList();

不相关的说明:调用ToList()未过滤的表通常是一件非常糟糕的事情。

出于这个原因,最好返回IQueryable<T>或 ORM 的首选IQueryable<T>包装器。例如,对于 LINQ-to-SQL,这可能是:

public Table<T> GetTable<T>()
{
    return ctx.GetTable<T>();
}

或使用实体框架:

public DbDet<T> GetTable<T>()
{
    return ctx.Set<T>();
}

但是,您还应该仔细考虑数据上下文的生命周期管理;在问题的代码中,您new是数据上下文 - 然后此上下文是自由浮动的,并且不会以我认为可以接受的方式进行清理。您可能应该更多地考虑生命周期管理。

于 2013-08-28T11:25:02.577 回答
4

您可以在此处使用Cast方法。

if (typeof(T) == typeof(tables))
    res = _context.tables.Cast<T>().ToList();
if (typeof(T) == typeof(columns))
    res = _context.columns.Cast<T>().ToList();

然而,这看起来不是一个好的通用方法。当您需要返回另一种类型的列表时,您将不得不更改代码。您应该找到一种使用另一种通用方法从上下文中获取项目的方法。如果那不可能,我建议放弃通用方法并为这些类型编写两个单独的方法。

于 2013-08-28T11:23:42.820 回答