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 关于继承的文档
下午好,我希望传输实现特定接口(“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 关于继承的文档