如何创建一个类或一组类来表示一个值,该值可以是整数、字符串或字符串列表

本文关键字:一个 字符串 列表 整数 一组 创建 何创建 表示 | 更新日期: 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>.DefaultEqualityComparer<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()方法。