C# 将继承类型的对象列表强制转换为新接口类型列表

C# 将继承类型的对象列表强制转换为新接口类型列表,c#,.net,C#,.net,例如,假设我们有以下接口和类配置: public interface IAnimal { } public interface IDog : IAnimal { } public class Animal : IAnimal { } 然后在这样的实现中使用上述配置 List<IAnimal> listOfAnimals = new List<Animal>(); List listofaimals=new List(); 我希望用这样的方式将其转换为列表

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

public interface IAnimal 
{

}

public interface IDog : IAnimal
{

}

public class Animal : IAnimal
{

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

List<IAnimal> listOfAnimals = new List<Animal>();
List listofaimals=new List();
我希望用这样的方式将其转换为列表IDog:

List<IDog> listOfDogs = listOfAnimals.Cast()<IDog>.ToList();
List listOfDogs=listOfAnimals.Cast().ToList();
我也试过了

List<IDog> listOfDogs = listOfAnimals.Cast()<IAnimal>.Cast()<IDog>.ToList();
List listOfDogs=listOfAnimals.Cast().Cast().ToList();
这有可能吗,有可能吗?我不能100%确定这是否可以做到???

目前我收到了一个无效的例外

List<IDog> listOfDogs = listOfAnimals.Cast<IAnimal>().Cast<IDog>().ToList();
还要注意,您的
()
是反向的。另一件需要注意的事情是,任何不是
IDog
的项目都将被忽略,并且不会返回

评论更新:

我相信你在处理这些问题时可以双向选择 接口的继承等,例如:IAnimal->IDog和IDog->IAnimal

如果所有项目都实现了
IDog
,则这是正确的。你可以毫无疑问地来回走动。但是,如果您有一个
Animal
的实例,则不能转到
IDog
,除非该动物实际实现了
IDog

想象你有动物、狗和猫。显然狗和猫都是动物。他们可以轻易地进入任何想要动物的地方。然而,你们不能明确地给任何想要狗或猫的动物。为此,你需要向上抛掷。如果对象类型正确,则强制转换将成功,但如果您试图将猫变成狗,则强制转换将失败

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;

我非常确定
List listofaimals=new List()
不会编译,因为它允许您将
Foo:IAnimal
添加到
列表中(通过执行
listofaimals.add(myFoo)
),即使
Foo
只是一个
IAnimal
,不是
Animal
。当您尝试此代码时发生了什么?当您尝试转换时,列表中包含了什么?
listofaimals.cast()
在语法上无效
listofaimals.Cast()
将编译,但如果任何列表元素未实现
IDog
,则会在运行时失败。如果要忽略这些,可以使用类型为的
列出listOfDogs=listOfAnimals.OfType().ToList()为了澄清这可能有点混乱,因为你可以看到Animal类没有实现IDog,但是我认为可以将IAnimal实现强制转换为IDog,因为IDog继承自IAnimal,我相信你通常可以这样强制转换。请看我上面的评论,列表中充满了实现IDog的动物对象IAnimal,但不是IDog,但我相信在处理接口继承等问题时,可以采用两种方法。例如:IAnimal->IDog和IDog->IAnimal
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;