gpt4 book ai didi

c# - 在 List 或 List 中设置/确定具体类型的最佳做法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 21:07:21 25 4
gpt4 key购买 nike

如果我有:

List<iCanSpeak>或者 List<Animal>

许多类型实现了接口(interface) iCanSpeak或者使用抽象类 Animal作为基类。

确定/设置我的实际列表中的具体类型的最佳做法是什么?

我知道 C# 提供 .TypeOf并且我已经看到在基类或接口(interface)中使用枚举来简化确定的示例,但最佳实践是什么?为什么?

可能偏离主题的跟进:

另外,什么是TypeOf在引擎盖下做什么?它正在类型转换吗?为什么不同具体类的属性在放入 list<abstractClass> 时不会丢失? ?

是否... List<AbstractClass> == List<interface>

定义的方法和属性是否相同?

最佳答案

您可以使用 .OfType<TSomeInterfaceOrClassOrAbstractClassOrStruct>()扩展方法,用于选择 iCanSpeak 类型或从其继承的所有列表成员。

在您的情况下,这可能是:MyList.OfType<ICanSpeak>() .

一些引用资料:DotNetPearlsMSDN .

Does... List<AbstractClass> == List<interface>

If the defined methods and properties are the same?

没有。他们没有。由于列表是一个通用类,您不能将它们相互转换。您将需要一个转换/转换函数来为您执行此操作。

这可以是 .OfType<T>过滤器,或 .Cast<T>返回一个新的 IEnumerable那种类型,或.Select(x => (yournewtype)x)这也返回一个 IEnumerableyournewtype .我更喜欢 .Cast<T> (此方法用于将 implementation 的列表转换为 IInterfaceThatIsImplemented 的列表)如果可能,否则 .OfType<T>如果您不需要所有成员,而只需要具有特定类型的成员。

例子:

var cars = new List<Car>();
var vehicles = cars.Cast<IVehicle>(); // works
var carsAndBicycles = new List<IVehicle>(); // think of some cars and bicycles in here
var otherCars = carsAndBicycles.OfType<Car>(); // works
var broken = carsAndBicycles.Cast<Car>(); // this breaks when carsAndBicycles doesnt only contain cars
// this is what .OfType<T> is useful for.

更深入一点——我上面写的不是很准确。

(来源:乔恩斯基茨 Edulinq Implementation/Blog)

List<AbstractClass>List<interfaceThatIsImplementedInAbstractClass>是一样的。

不是在 C# 中,编译器不允许,但 CLR 允许。

如果绕过编译器的检查,它就可以工作。

(我不推荐在任何合理的代码中使用那个“hack”!)

int[] ints = new int[10];
// Fails with CS0030
IEnumerable<uint> uints = (IEnumerable<uint>) ints;

// Succeeds at execution time
IEnumerable<uint> uints = (IEnumerable<uint>)(object) ints;

让我们玩得更开心:

int[] ints = new int[10];

if (ints is IEnumerable<uint>)
{
Console.WriteLine("This won’t be printed");
}
if (((object) ints) is IEnumerable<uint>)
{
Console.WriteLine("This will be printed");
}

关于c# - 在 List<interface> 或 List<abstract Class> 中设置/确定具体类型的最佳做法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40334760/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com