【发布时间】:2020-05-28 13:22:37
【问题描述】:
我真的不知道如何将泛型类型与 IEnumerable 一起使用,以便我可以遍历给定泛型值包含的值。
考虑以下类(注意这里的类仅用于示例目的):
public class Parameter<T> : IParameter<T> where T : IEnumerable<T>
{
public List<UInt64> output = new List<UInt64>();
private T _value;
public T Value
{
get => ...;
set
{
// I want to be able to apply special treat to the value
// Value can be of any type: int, int[], bool, bool[]
foreach (var v in value)
{
output.Add(Convert.UInt64(v) + 5);
}
...
}
}
}
public interface IParameter<T> where T : IEnumerable<T>
{
T Value { get; set; }
}
然后我有一个测试模块来实例化一些参数,但我什至无法在这里编译。我什至尝试在下面将 bool[] 替换为 IEnumerable,但编译器也不喜欢它。
public class TestModule : ModuleBase, ITestModule
{
public IParameter<bool[]> Test1 { get; set; } = new Parameter<bool[]>();
public IParameter<uint[]> Test2 { get; set; } = new Parameter<uint[]>();
...
public IParameter<int> Test3 { get; set; } = new Parameter<int>();
}
我确实考虑过对 Parameter() 类使用重载,但我认为为每个支持的类型创建一个类是多余的(考虑到它仅适用于 Value 属性)。
【问题讨论】:
-
在
foreach循环中,您希望v属于哪种类型?换句话说,Convert.UInt64接受什么? -
另外,“ANY TYPE”意味着你回退到一个通用对象。在 bool 和 bool[] 之间没有完全相同的东西。你最好至少有几个方法——一个用于数组,一个不用于。数组。
-
TBH,如果你有特定类型的行为,泛型可能不是这里的正确选择。
-
看起来您需要不止一种泛型类型,因为
T : IEnumerable<T>没有多大意义。可能是Parameter<T, U> : IParameter<T, U> where T : IEnumerable<U>之类的东西?请注意,bool[]与该约束不匹配,因为它是IEnumerable<bool>而不是IEnumreable<bool[]>如果您需要处理单个项目和集合,那么您应该将它们分开,因为您无法以通用方式处理它们(除非您只需将单个项目强制放入集合中)。 -
恕我直言;
public IEnumerable<T> Value { get ... set ... }
标签: c# generics ienumerable