通用列表问题

Par*_*der 1 c# generics ilist

我有这样的对象.

public class BaseTable
{
    public int ID               { get; set; }
    public int ParentID         { get; set; }
    public string Description   { get; set; }
    public bool IsActive        { get; set; }    

}

public class CarFuelType : BaseTable
{

}
Run Code Online (Sandbox Code Playgroud)

和一个测试课

public class Test
{
    public IList<CarFuelType> GetAllActiveFuelTypes()
    {
        var result = GetAllActiveData<CarFuelType>(LookUpTableConstants.CarFuelType);

        return result.Cast<CarFuelType>().ToList(); 
    }


    private IList<T> GetAllActiveData<T>(int filter)
    {
        var result = from c in _lookUpTableValuesRepository.GetAllRowsWhere(l => l.ParentID == filter && l.IsActive==true)
                     select new BaseTable{ ID = c.ID, Description = c.Description, ParentID = c.ParentID };
        return result.ToList() as IList<T>;
    }
Run Code Online (Sandbox Code Playgroud)

}

但我从GetAllActiveData方法返回null结果.无论如何我将IList从一种类型转换为另一种类型.

Jon*_*eet 6

你在这里遇到了一个问题,因为你实际上并没有创建派生类的任何实例.你需要实际创建CarFuelType而不是BaseTable.一旦你完成了,你将不需要任何铸造.你可以用这种方式做到这一点 - 至少对于LINQ to Objects:

private IList<T> GetAllActiveData<T>(int filter) where T : BaseTable, new()
{
    var result = from c in _lookUpTableValuesRepository
                               .GetAllRowsWhere(l => l.ParentID == filter 
                                                && l.IsActive==true)
                 select new T() { ID = c.ID, 
                                  Description = c.Description,
                                  ParentID = c.ParentID };
    return result.ToList();
}
Run Code Online (Sandbox Code Playgroud)

我怀疑这对于LINQ to SQL或实体框架是否有用......你可能必须在LINQ to SQL查询中创建BaseTable实例,然后在内存中转换它们,例如

    var baseQuery = from c in _lookUpTableValuesRepository
                               .GetAllRowsWhere(l => l.ParentID == filter 
                                                && l.IsActive==true)
                 select new BaseTable { ID = c.ID, 
                                        Description = c.Description,
                                        ParentID = c.ParentID };

    var converted = baseQuery.AsEnumerable()
                             .Select(b => new T() { ID = b.ID, 
                                                    Description = b.Description,
                                                    ParentID = b.ParentID };
Run Code Online (Sandbox Code Playgroud)

然而,这可能会失去"实体性" - 您可能无法使用这些对象进行更新等.