2009-02-11 3 views
3

Мне нужно указать, что тип Generic должен принимать только перечисленные типы только в закрытом типе. Может ли кто-нибудь предложить способ сделать это, если сдерживающие способности не могут работать?Как ограничить аргументы типа общего типа конкретным типом, кроме ограничений?

+0

Кстати, что вы хотите сделать? Если это для «флагов» побитовая арифметика с дженериками (общий вопрос), есть еще один вариант ... –

ответ

2

Ближайшее ограничение структура:

класс C < E> где Е:/* * перечисление/структура

Если вам нужно, чтобы убедиться, что он является использование перечисления TypeOf (E) .IsEnum

5

Вы не можете сделать это непосредственно в C# - тип перечисления не используется в качестве ограничения. Один из вариантов (grungy) - использовать инициализатор типа (статический конструктор) для проверки во время выполнения. Он остановит его, используя несоответствующие типы во время выполнения, но не во время компиляции.

class Foo<T> where T : struct { 
    static Foo() { 
     if (!typeof(T).IsEnum) { 
      throw new InvalidOperationException("Can only use enums"); 
     } 
    } 
    public static void Bar() { } 
} 
enum MyEnum { A, B, C } 
static void Main() { 
    Foo<MyEnum>.Bar(); // fine 
    Foo<int>.Bar(); // error 
} 
+0

Это может быть расстраивающим ограничением .net порой - тем более, что Enum не единственный тип, который исключается из используемые в ограничении - так: System.Delegate, System.Array и System.ValueType. – LBushkin

+0

@LBushkin - ValueType выполним через: struct (хотя это исключает Nullable ) –

0

Так как вы сказали, что вы не можете использовать ограничения, единственное другое решение пришло мне в голову, чтобы использовать динамическое приведение и проверить во время выполнения результата. Это гораздо хуже, чем использование ограничений в качестве решения. Однако, here вы можете найти статью, которая может помочь.

Смежные вопросы