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;