例如,假设我们有以下接口和类配置:
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
答案 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;