我有以下类:
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;
但是,它返回空值。如何成功投射到我的列表中?
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);
您要执行的操作等效于以下内容:
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();
您要做的是向下投射List<Column>
到ColumnList
,假设所有List<T>
都是ColumnList
的 - 显然它们不是。
但是,您可以做的是通过传递查询结果来初始化ColumnList
的新实例
new ColumnList().AddRange(othercolumnlist
.Select(x => new Column { Name = x.Name })
.ToList());
如果您为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
,但反之亦然。