gpt4 book ai didi

c# - 将类型定义为类型的超集

转载 作者:太空狗 更新时间:2023-10-30 01:16:35 25 4
gpt4 key购买 nike

假设我有一个基本的继承结构:

public class Letter {...}
public class A : Letter {...}
public class B : Letter {...}
public class C : Letter {...}

public class Number {...}
public class One : Number {...}

我想定义一个 Type 数组,这样只有从 Letter 继承的 Type 才有效。所以示例数组可能如下所示:

(type)[] myArray = new (type)[] {typeof(A), typeof(B), typeof(C)};

但是作业

myArray[0] = typeof(One);

会失败。是否可以定义这样的结构?

最佳答案

所有类型都是 System.Type 的实例, 静态相同。因此,不可能使用传统阵列来执行此操作。一种选择是创建一个只允许通过类型参数进行添加的数据结构:

internal sealed class LetterTypeSet : IReadOnlyCollection<Type>
{
readonly ISet<Type> types = new HashSet<Type>();
public IEnumerator<Type> GetEnumerator() => this.types.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => this.GetEnumerator();
public int Count => this.types.Count;

public bool Add<T>()
where T : Letter
{
return this.types.Add(typeof (T));
}
}

这将允许:

var letters = new LetterTypeSet();
letters.Add<A>(); //ok
letters.Add<B>(); //ok
letters.Add<One>(); //CS0311 "The type 'One' cannot be used ..."

注意:我使用的是 ISet<T>作为底层数据结构,您可能想也可能不想使用 List<T>而不是根据要求。

关于c# - 将类型定义为类型的超集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34732720/

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