如何使方法适用于任何枚举

时间:2009-11-28 03:47:22

标签: c# enums

我有以下代码,其中ApplicationType是枚举。我在许多其他枚举上有相同的重复代码(除参数类型之外的所有内容)。什么是整合此代码的最佳方法?

 private static string GetSelected(ApplicationType type_, ApplicationType checkedType_)
    {
        if (type_ == checkedType_)
        {
            return " selected ";
        }
        else
        {
            return "";
        }
    }

4 个答案:

答案 0 :(得分:2)

从臀部拍摄,有点像......

private static string GetSelected<T>(T type_, T checkedType_) where T : System.Enum{
  //As before
}

显然这是非法的。

为了简单地减少重复,你可以直接用Enum替换T,

private static String GetSelected(Enum type_, Enum checkedType_){
  if(type_.CompareTo(_checkedType) == 0) return "selected";

  return "";
}

虽然这不会对类型安全造成太大影响,因为可以传入两种不同的枚举类型。

您可以在运行时失败:

private static String GetSelected(Enum type_, Enum checkedType_){
   if(type_.GetType() != checkedType.GetType()) throw new Exception();
   //As above
}

为了获得一些编译时安全性,您可以使用通用约束,但由于您无法使用Enum类,因此无法限制所有内容:

private static String GetSelected<T>(T type_, T checkedType_) where T : IComparable, IFormattable, IConvertible{
  if(!(first is Enum)) throw new Exception();
  //As above
}

上面将确保你只传递相同类型的枚举(如果传入两个不同的枚举,你会得到一个类型推断错误)但是当满足T约束的非枚举传递时会编译。 / p>

不幸的是,这个问题似乎没有一个很好的解决方案。

答案 1 :(得分:0)

在编译时通过通用约束很难做到这一点,因为enum实际上是int。您需要在运行时限制值。

答案 2 :(得分:0)

对于enum的平等?简化:

public static string GetSelected<T>(T x, T y) {
    return EqualityComparer<T>.Default.Equals(x,y) ? " selected " : "";
}

可以where T : struct添加到第一行,但 没有这样做。

有关演示的完整示例:

using System;
using System.Collections.Generic;
static class Program {
    static void Main() {
        ApplicationType value = ApplicationType.B;
        Console.WriteLine("A: " + GetSelected(value, ApplicationType.A));
        Console.WriteLine("B: " + GetSelected(value, ApplicationType.B));
        Console.WriteLine("C: " + GetSelected(value, ApplicationType.C));
    }
    private static string GetSelected<T>(T x, T y) {
        return EqualityComparer<T>.Default.Equals(x, y) ? " selected " : "";
    }
    enum ApplicationType { A, B, C }
}

答案 3 :(得分:0)

这是否适合您的需要?

private static string GetSelected<T>(T type_, T checkedType_)
    where T: struct
{
    if(type_.Equals(checkedType_))
        return " selected ";
    return "";
}