【问题标题】:How to create a class or set of classes that represent a Value, be it an integer or string or list of strings如何创建一个或一组表示值的类,无论是整数、字符串还是字符串列表
【发布时间】:2011-10-28 00:46:52
【问题描述】:

我如何在一个类中表示代表值的东西。

此值将用于写入比较操作,如 EqualTo、GreaterThan 等。

现在要注意的是,值有时可能是整数、字符串,甚至是整数或字符串列表。

我如何在一个类或一组类中表示它(可能从基类继承)

然后我可以写一个像这样的方法吗:

EqualTo(IValue value, IValue otherValue)

如果我传入一个字符串或字符串列表、日期时间或日期时间列表并相应地返回真/假,这个 EqualTo 方法现在如何处理?

注意:

关键是我将根据来自数据库的数据构建这些对象,因此实际的数据类型、值或值等。

【问题讨论】:

    标签: c# design-patterns


    【解决方案1】:

    你可以写:

    EqualTo<T>(T value1, T value2) where T : IEquatable<T>
    

    或大于和小于:

    Compare<T>(T value1, T value2) where T : IComparable<T>
    

    考虑到IComparable&lt;T&gt;IEquatable&lt;T&gt;,这两个都非常简单:)

    您需要单独的重载(或不同的方法)来处理此类值的序列

    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&lt;T&gt;.DefaultEqualityComparer&lt;T&gt;.Default

    如果您想以与非序列相同的方法处理序列,您始终可以检查T 是否实现了IEquatable&lt;T&gt;,如果没有,它是否为某些实现TElementIEquatable&lt;TElement&gt; 实现了IEnumerable&lt;TElement&gt; .请注意,这会变得非常混乱......

    编辑:好的,如果你要动态地获得这些东西......

    • 首先确定它们是否是列表。您需要单独处理。假设它确实是List&lt;T&gt;,你可以这样做:

      if (value1.GetType().IsGenericType &&
          value1.GetType().GetGenericTypeDefinition() == typeof(List<>))
      {
          // Handle this case separately, definitely in another method.
          // It'll be a pain.
      }
      
    • 否则,仅使用普通的Equals() 调用来检查是否相等,并将值强制转换为非泛型IComparable 类型以获得大于/小于。这并不理想,但它应该可以工作......

    【讨论】:

    • 我更新了我的问题,因为数据将通过数据库构建,所以这本质上是动态的。
    • @codecompleting:好的,这完全改变了事情。你甚至知道类型是否相同吗?您不想开始将 int 与字符串列表进行比较...
    • 对不起,我的错误。是的,您可以假设类型相同(假设您的意思是在列表/集合中)。
    • @codecompleting:好的,我已经编辑了我的答案。基本上这会很痛苦:(
    • @codecompleting:那么为什么不直接打开那个值,然后按照我的第一个版本调用一个泛型方法呢?
    【解决方案2】:

    另一种方法是确保您的类型实现 IComparable 并使用其 CompareTo() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-13
      • 2017-06-01
      • 2011-08-20
      • 2011-07-24
      • 2020-07-29
      • 1970-01-01
      • 2011-06-12
      • 1970-01-01
      相关资源
      最近更新 更多