gpt4 book ai didi

c# - 我可以持有同一后代的对象类型列表<>吗?

转载 作者:太空狗 更新时间:2023-10-29 22:16:37 25 4
gpt4 key购买 nike

我需要保存一份允许执行特定操作的对象类型列表。

示例 Animal有 3 个后代 Tiger , Human , Hippo

我只想允许 Tiger s 和 Hippo要关在动物园的笼子里吗?我需要一份动物类型列表。

我会喜欢比 List<Type> 更好的东西

这只是一个简化的示例。我不喜欢关在笼子里的动物..

编辑

因为不清楚。我想在列表中保留对象类型而不是实际对象。

例子:

List<Type> types = new List<Type>();
types.Add(typeof(Hippo));
types.Add(typeof(Tiger));

这是程序员能做到的极限types.Add(typeof(Human))这是我不想拒绝的。

edit2

只是为了澄清我的问题。我希望能够动态 Register允许的类型并且没有结果 if就像下面的一些答案一样。

最佳答案

如果您只需要特定类型的列表:

泛型中没有任何东西可以支持您的要求,因此只需创建一个允许您存储 Type 类型的自定义类型,并在运行时使用代码来防止无效条目:

public class CagedTypes 
{
private readonly List<Type> _types;

public void Add(Type t)
{
if (t == typeof(Hippo) || t == typeof(Tiger))
_types.Add(t);
}
}

虽然我不明白你为什么需要这个。

如果您只需要特定类型的列表,则可以选择:

和上面一样做,但包括下面的接口(interface),并将添加检查更改为如下内容:

public void Add(Type t)
{
if (t.GetInterfaces().Contains(typeof(ICanBeHeldInZooCage)))
_types.Add(t);
}

您还可以使用属性,因为您可以使用 GetAttributes 方法查询任何属性的类型。

如果您希望列表中只包含某些实例:

创建标记界面:

public interface ICanBeHeldInZooCage

TigerHippo 实现(不需要做任何事情),那么你可以:

var cagedAnimals = new List<ICanBeHeldInZooCage>();

关于c# - 我可以持有同一后代的对象类型列表<>吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12746603/

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