如何创建一个类或一组类来表示一个值,该值可以是整数、字符串或字符串列表
本文关键字:一个 字符串 列表 整数 一组 创建 何创建 表示 | 更新日期: 2023-09-27 18:12:39
如何在类中表示代表值的东西
该值将用于写比较操作,如EqualTo, GreaterThan等。
现在的问题是,值有时可以是整数、字符串,甚至是整数或字符串的列表。
如何在一个类或一组类(可能从基类继承)中表示它
我可以写一个方法吗?
EqualTo(IValue value, IValue otherValue)
这个EqualTo方法现在如何处理,如果我传入一个字符串,或字符串列表,日期时间或日期时间列表,并相应地返回true/false ?
注意:
问题是我将根据来自数据库的数据构建这些对象,因此实际的数据类型,值或值等
你可以这样写:
EqualTo<T>(T value1, T value2) where T : IEquatable<T>
或大于或小于:
Compare<T>(T value1, T value2) where T : IComparable<T>
这两个都很简单,给定IComparable<T>
和IEquatable<T>
:)
SequenceEqualTo<T>(IEnumerable<T> sequence1, IEnumerable<T> sequence2)
where T : IEquatable<T>
SequenceCompare<T>(IEnumerable<T> sequence1, IEnumerable<T> sequence2)
where T : IComparable<T>
或者,如果您不想要通用约束,您可以使用Comparer<T>.Default
和EqualityComparer<T>.Default
。
如果你想用与非序列相同的方法处理序列,你总是可以检查T
是否实现了IEquatable<T>
,如果没有,是否对一些实现了IEquatable<TElement>
的TElement
实现了IEnumerable<TElement>
。这会让人很困惑,提醒你…
编辑:好的,如果你要动态地得到这些东西…
首先弄清楚它们是否是列表。你需要单独处理。假设它真的是
List<T>
,您可以这样做:if (value1.GetType().IsGenericType && value1.GetType().GetGenericTypeDefinition() == typeof(List<>)) { // Handle this case separately, definitely in another method. // It'll be a pain. }
否则,只使用正常的
Equals()
调用来检查是否相等,并将大于/小于的值强制转换为非泛型IComparable
类型。这不是理想的,但它应该工作…
另一种方法是确保您的类型实现IComparable并使用它的CompareTo()方法。