【问题标题】:How can I make this code with enumerations generic?如何使用枚举使此代码通用?
【发布时间】:2010-11-01 10:05:44
【问题描述】:

我正在为实体框架 4 中的 ENUM 创建包装 POCO 类,如 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。我可以在这里使用泛型,这样我就可以对所有 ENUM 事件使用相同的代码。

我是仿制药新手,所以需要专家的帮助。

【问题讨论】:

标签: c# entity-framework generics


【解决方案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);

编辑: Assign() 是一个虚拟方法。我的目的是展示如何使用枚举作为通用约束。

【讨论】:

  • 没有意义。当他可以执行 agen.EnumValue = gender.Male 时,为什么还要执行 agen.Assign(gender.Male)? OP 需要能够将枚举从整数转换为整数。
  • @VinayC,是的,你是对的,这没有任何意义,实际上是询问 OP 如何使枚举绑定泛型类。所以我刚刚创建了一个虚拟类。我的目的是向他展示如何使用枚举作为通用约束......
  • @Ramesh - 如果我需要从包装器本身返回 Enum 的默认值怎么办?
【解决方案2】:

不可能有通用转换运算符。因此,上述代码不可能有完全通用的等价物。此外,不能将枚举称为泛型类型约束,因此在属性实现中进行强制转换也是不可能的(或者可能需要一些其他约束(可能是接口)才能工作,这可能会导致装箱/拆箱)。简而言之,IMO,具有合理性能的通用解决方案可能是不可行的。

我建议您尝试使用代码生成(查看 T4 模板)来创建您的包装类。 T4 非常简单 - 请参阅此处的几个链接:http://www.hanselman.com/blog/T4TextTemplateTransformationToolkitCodeGenerationBestKeptVisualStudioSecret.aspx

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2013-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多