将类型继承到新接口类型列表的转换对象列表

时间:2017-08-21 15:45:27

标签: c# .net

例如,假设我们有以下接口和类配置:

public interface IAnimal 
{

}

public interface IDog : IAnimal
{

}

public class Animal : IAnimal
{

}

然后在像这样的实现中使用上述配置

List<IAnimal> listOfAnimals = new List<Animal>();

我希望用以下内容将其转换为List IDog:

List<IDog> listOfDogs = listOfAnimals.Cast()<IDog>.ToList();

我也试过

List<IDog> listOfDogs = listOfAnimals.Cast()<IAnimal>.Cast()<IDog>.ToList();

这是可能的吗?如果可以做到,我可能无法100%确定吗?

目前我收到了InvalidCastException

1 个答案:

答案 0 :(得分:2)

List<IDog> listOfDogs = listOfAnimals.Cast<IAnimal>().Cast<IDog>().ToList();

这仅适用于listOfAnimals实际为IDog的情况。我相信你要找的是OfType

List<IDog> listOfDogs = listOfAnimals.OfType<IDog>().ToList();

另请注意,您的()<>已被撤消。另外需要注意的是,任何不是IDog的项目都将被忽略而不会返回。

评论更新:

  

我认为你在处理时可以两种方式   接口的继承等.eg:IAnimal - &gt; IDog和IDog - &gt; IAnimal

如果所有项目都实现IDog,则为真。你可以毫无问题地来回走动。但是,如果您有Animal的实例,则除非该动物实际执行IDog,否则无法转到IDog

想象一下,你有动物,狗和猫。显然,狗和猫都是动物。他们可以很容易地进入任何想要动物的东西。但是,你不能明确地给动物任何想要狗或猫的东西。为此,你需要向上施展。如果对象是正确的类型,则转换将成功,但如果您尝试将Cat变为Dog,它将失败。

C#是一种静态类型语言。即使Cat和Dog之间没有方法签名不同,并且界面是空的,它们也不是一回事。

public interface IAnimal 
{
}

public interface IDog : IAnimal
{
}

public interface ICat : IAnimal
{
}

public class Animal : IAnimal
{
}

public class Dog : Animal, IDog
{
}

public class Cat : Animal, ICat
{
}

Animal animal = null;
var dog = new Dog();
var cat = new Cat();

animal = dog; //Success
animal = cat; //Success
cat = (Cat)animal; //Success because animal is a cat.
dog = (Dog)animal; //Fail because animal is a cat.
//The above is the same as attempting to do:
dog = cat;