Как заставить метод работать для любого перечисления - PullRequest
2 голосов
/ 28 ноября 2009

У меня есть следующий код, где ApplicationType является перечислением. У меня есть такой же повторный код (все, кроме типов параметров) на многих других перечислениях. Каков наилучший способ закрепить этот код?

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

Ответы [ 4 ]

2 голосов
/ 28 ноября 2009

Съемка с бедра, что-то вроде ...

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

Видимо, это незаконно.

Чтобы просто сократить повторение, вы можете просто заменить T на Enum таким образом,

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
}

Вышеприведенное гарантирует, что вы передадите только Enums одного и того же типа (вы получите ошибку вывода типа, если вы передадите два разных Enums), но скомпилирует, когда будут переданы не-Enum, которые удовлетворяют ограничениям на T.

К сожалению, похоже, что нет отличного решения этой проблемы.

0 голосов
/ 28 ноября 2009

Подходит ли это для ваших нужд?

private static string GetSelected<T>(T type_, T checkedType_)
    where T: struct
{
    if(type_.Equals(checkedType_))
        return " selected ";
    return "";
}
0 голосов
/ 28 ноября 2009

за равенство на эмуме? Просто:

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 }
}
0 голосов
/ 28 ноября 2009

Трудно сделать это с помощью общего ограничения во время компиляции, потому что enum действительно int. Вам нужно будет ограничить значения во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...