C# 中的列表、多态性和强制转换问题

Problem with lists, polymorphism and casting in C#

下午好,我希望传输实现特定接口(“IRecord”)的对象列表,我所做的是在新列表中过滤实现以下情况中接口的对象“IEntry” ”,直到没有问题,但是,当我尝试将过滤列表转换为“IList”类型以使用最后一个具有的属性时遇到问题,这会产生异常,我该如何解决这个问题,有没有一种避免遍历整个列表并再次创建新列表的方法?

interface IRecord
{
    string Details { get; set; }
}

interface IEntry : IRecord
{
    decimal TotalValue { get; set; }
}

interface IEgress : IRecord
{
    string Type { get; set; }
}

class Entry : IEntry
{
    public string Details { get; set; }
    public decimal TotalValue { get; set; }

    public void Foo() { }
}

class Egress : IEgress
{
    public string Details { get; set; }
    public string Type { get; set; }
}

这是我要执行的代码

var records = new List<IRecord>() { new Entry() { Details = "foo" }, new Egress() { Details = "bar" } };

var filteredList = records.Where(entry => entry is Entry).ToList();

var sum = (IList<IEntry>)filteredList;
var x = sum.Sum(en => en.TotalValue);

如评论中所述,您可以 Cast 在调用 ToList()

之前进行查询

var filteredList = records.Where(entry => entry is Entry).Cast<IEntry>().ToList();

所以最终结果会是

var records = new List<IRecord>() 
{ 
    new Entry() { Details = "foo", TotalValue = 12 }, 
    new Egress() { Details = "bar" } 
};

var filteredList = records.Where(entry => entry is Entry).Cast<IEntry>().ToList();

var sum = (IList<IEntry>)filteredList;
var x = sum.Sum(en => en.TotalValue);

我也为您的 Entry 类型添加了一个值,这样您就可以证明您的代码有效 :D

Here 是 link Microsoft 关于继承的文档