Как сделать этот код универсальным? - PullRequest
0 голосов
/ 01 ноября 2010

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

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 кроме пола, как упомянуто выше. Могу ли я использовать здесь дженерики, чтобы я мог использовать один и тот же код для всех вхождений ENUM.

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

Ответы [ 2 ]

1 голос
/ 01 ноября 2010

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

 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);

РЕДАКТИРОВАТЬ: Assign () является фиктивным методом. Я хотел показать, как использовать enum как общее ограничение.

0 голосов
/ 01 ноября 2010

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

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

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