2010-11-01 3 views
0

Я создаю классы POCO обертки для ENUM в Entity Framework 4, как указано here. Я создал обертку для перечисления следующим образом:Как сделать этот код общим?

public class PriorityWrapper 
    { 
     private gender _t; 
     public int Value 
     { 
      get 
      { 
       return (int)_t; 
      } 
      set 
      { 
       _t = (gender)value; 
      } 
     } 
     public gender EnumValue 
     { 
      get 
      { 
       return _t; 
      } 
      set 
      { 
       _t = value; 
      } 
     } 

     public static implicit operator PriorityWrapper(gender p) 
     { 
      return new PriorityWrapper { EnumValue = p }; 
     } 

     public static implicit operator gender(PriorityWrapper pw) 
     { 
      if (pw == null) return gender.Male; 
      else return pw.EnumValue; 
     } 
    } 

Но у меня также есть другие ENUM, кроме указанных выше. Могу ли я использовать generics здесь, поэтому я могу использовать один и тот же код для всех событий ENUM.

Я новичок в дженериках, поэтому вам нужна помощь экспертов.

ответ

0

Невозможно иметь общие операторы преобразования. Таким образом, не может быть точного общего эквивалента для вышеуказанного кода. Кроме того, нельзя указать enum как ограничение общего типа, поэтому включение в реализацию свойства также невозможно (или может потребоваться какое-то другое ограничение (возможно, интерфейс) для работы, которое может привести к боксу/распаковке). Короче говоря, ИМО, имея общее решение с разумной производительностью, может оказаться невозможной.

Я предлагаю вам попробовать использовать генерацию кода (посмотрите на шаблоны T4) для создания ваших классов-оболочек. T4 довольно прост - см. Здесь для нескольких ссылок: http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

1

Вы не можете использовать перечисления как общие ограничения, вместо этого вы можете использовать.

public class EnumWrapper<T> 
    { 
     public static int Num = 1; 
     private T _t; 

     public T EnumValue 
     { 
      get 
      { 
       return _t; 
      } 
      set 
      { 
       _t = value; 
      } 
     } 

     public void Assign<U>(U inn) where U : struct, T 
     { 
      if (typeof(T).IsEnum) 
      { 
       EnumValue = inn; 
      } 


     } 
    } 

и вызывать его как этот

  var agen = new EnumWrapper<gender>(); 
      gender g=new gender() ; 
      agen.Assign (g); 

EDIT: Присвоить() является фиктивным методом. Мое намерение состояло в том, чтобы показать, как использовать enum как общее ограничение.

+0

не имеет смысла. Зачем делать agen.Assign (gender.Male), когда он может делать agen.EnumValue = gender.Male? OP нуждается в возможности конвертировать перечисление из/в целые числа. – VinayC

+0

@VinayC, да, вы правы, это не имеет никакого смысла, OP действительно спрашивает, как сделать enum связанный общий класс. Я просто создал фиктивный класс. Мое намерение состояло в том, чтобы показать ему, как использовать enum в качестве общего ограничения .... – RameshVel

+0

@ Ramesh - Что делать, если мне нужно вернуть значение по умолчанию Enum из самой оболочки? – Ram

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