林克投射上市

本文关键字:林克 | 更新日期: 2023-09-27 17:52:35

我有以下类:

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;

但是,它返回空值。如何成功投射到我的列表中?

林克投射上市<T>

ColumnListList<Column>,但List<Column>不是ColumnList。考虑Animal类和Dog类:

public class Animal
{
}
public class Dog: Animal
{
}

你想做的是把任何动物都当狗。但并非所有动物都是狗。可以有CatKangaroo.这就是为什么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,但反之亦然。