我有以下课程:
public class Column
{
public String Name;
public String Value;
}
public class ColumnList : List<Column> {}
然后我这样做:
var cols = (from c in othercolumnlist
select new Column
{
Name = c.Name,
}).ToList() as ColumnList;
但是它返回null。我怎样才能成功进入我的名单?
答案 0 :(得分:7)
ColumnList
是List<Column>
但List<Column>
不是ColumnList
。考虑Animal
和Dog
类:
public class Animal
{
}
public class Dog: Animal
{
}
你要做的是将任何动物视为狗。但并非所有动物都是狗。可以有Cat
或Kangaroo
。这就是as ColumnList
返回null
的原因。
您需要创建新的ColumnList
实例,并手动添加列:
var columnList = new ColumnList();
columnList.AddRange(othercolumnlist.Select(c => new Column { Name = c.Name }));
如果您需要经常这样做,那么您可以将静态创建方法添加到ColumnList
类:
public static ColumnList CreateFrom(ColumnList other)
{
var columnList = new ColumnList();
columnList.AddRange(other.Select(c => new Column { Name = c.Name }));
return columnList;
}
并以这种方式使用它:
var columnList = ColumnList.CreateFrom(otherColumnList);
答案 1 :(得分:4)
您尝试做的事情与此相同:
Animal animal = new Animal();
Dog dog = animal as Dog;
一种可能的解决方案是提供一个构造函数,该构造函数接受现有列表,并调用基础构造函数,例如:
public class ColumnList : List<Column>
{
public ColumnList(IEnumerable<Column> collection):
base(collection)
{
}
}
然后从现有馆藏中构建您的ColumnList
。
var collection = othercolumnlist.Select(c => new Column { Name = c.Name });
var columnList = new ColumnList(collection);
您还可以提供一种扩展方法,以便更轻松:
public static class ColumnListExtensions
{
public static ToColumnList(this IEnumerable<Column> collection)
{
return new ColumnList(collection);
}
}
var cols = othercolumnlist.Select(c => new Column { Name = c.Name })
.ToColumnList();
答案 2 :(得分:2)
您要做的是将List<Column>
向下投射到ColumnList
,假设所有List<T>
都是ColumnList
- 这显然不是ColumnList
您可以做的是通过传递查询结果来初始化new ColumnList().AddRange(othercolumnlist
.Select(x => new Column { Name = x.Name })
.ToList());
的新实例
{{1}}
答案 3 :(得分:0)
您可以为ColumnList
类型定义复制构造函数:
public class ColumnList : List<Column>
{
public ColumnList(IEnumerable<Column> src) : base(src)
{
}
}
然后你做:
var cols = new ColumnList(from c in othercolumnlist
select new Column
{
Name = c.Name,
}).ToList());
原因ToList()
会返回List
而不是ColumnList
。如果你明确地将它实例化为一个,它只能是ColumnList
,但反之亦然。