EnumParentAttribute和Intellisense

时间:2014-11-21 17:31:50

标签: c# enums

我有一个带枚举的课程

namespace Entities
{
    public partial class OrderStatusType : Entity
    {
        public enum EOrderStatusType
        {
            P2 = 1,
            Mounting = 2,
        }
    }
}

然后我有一个界面

namespace Interfaces
{
    public interface IAttribute<T>
    {
        T Value { get; }
    }

}

和另一个班级

namespace Entities
{
    public partial class OrderStatus : Entity
    {
        [DataContract]
        public enum EOrderStatus
        {
            [EnumMember(Value = "Film Ordered"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            FilmOrdered = 1,
            [EnumMember(Value = "Not Started"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            NotStarted = 2,
            [EnumMember(Value = "Cliche Ordered"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            ClicheOrdered = 3,
            [EnumMember(Value = "Cliche In Stock"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            ClicheInStock = 4,
            [EnumMember(Value = "Cliche Prepared"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            ClichePrepared = 5,
            [EnumMember(Value = "Ready to start"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            Readytostart = 6,
            [EnumMember(Value = "Started"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            Started = 7,
            [EnumMember(Value = "Interrupted"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            Interrupted = 8,
            [EnumMember(Value = "Completed"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            Completed = 9,
            [EnumMember(Value = "ClichV status"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            ClichVstatus = 10,
            [EnumMember(Value = "Cliche Mounting"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            ClicheMounting = 11,
            [EnumMember(Value = "In Stock"), EnumParent(OrderStatusType.EOrderStatusType.P2)]
            InStock = 12,
            [EnumMember(Value = "Ordine con cilindri montati"), EnumParent(OrderStatusType.EOrderStatusType.Mounting)]
            OrdineConCilindriMontati = 13,
        }

        [AttributeUsage(AttributeTargets.Field)]
        public sealed class EnumParentAttribute : Attribute, Library.Interfaces.IAttribute<OrderStatusType.EOrderStatusType>
        {
            public EnumParentAttribute(OrderStatusType.EOrderStatusType EOrderStatusType) { this.mValue = EOrderStatusType; }

            private OrderStatusType.EOrderStatusType mValue;

            public OrderStatusType.EOrderStatusType Value { get { return mValue; } }
        }
    }
}

在OrderStatus类中,我创建了一个密封的子类EnumParentAttribute,它继承自属性并实现了接口,我可以在其中传递OrderStatusType.EOrderStatusType类型的参数,所以现在我可以使用自定义属性EnumParent来装饰枚举EOrderStatus的项目,接受OrderStatusType.EOrderStatusType类型的参数。

原因是我想在两个枚举之间创建一种儿子 - 父亲的关系。 但是我想再迈一两步......

问题:

1)如何添加“constarint”,强制我使用自定义属性EnumParent修饰新的EOrderStatusType项?有一种方法可以要求编译器在编译期间通知异常吗? 2)如何扩展EOrderStatusType枚举,以便我可以编写如下代码:     OrderStatus.EOrderStatusType(P2)l_MyEnum = OrderStatus.EOrderStatus.FilmOrdered; Intellisense只向我显示“正确”父项的项目?

对不起我的英语,我希望这是可以理解的......

提前致谢!

1 个答案:

答案 0 :(得分:0)

  

如何添加&#34; constarint&#34;这迫使我用自定义属性EnumParent修饰一个新的EOrderStatusType项?有一种方法可以要求编译器在编译期间通知异常吗?

两个选项:

  • 添加单元测试。这很容易做到,它有望阻止你提交错误的代码(假设你没有运行测试就不提交),但它实际上并没有显示在编译时。
  • 使用Visual Studio 2015和Roslyn挂钩编译器,并创建一个代码诊断程序,将其显示为错误。 (你可能想让它依赖于在枚举本身上声明的属性,而不是将其硬编码到一个特定的枚举。)当然,Visual Studio 2015只是在我写这个时预览 - 但它随着时间的推移,它将成为越来越合理的解决方案。
  

如何扩展EOrderStatusType枚举,以便我可以编写如下代码:OrderStatus.EOrderStatusType(P2)l_MyEnum = OrderStatus.EOrderStatus.FilmOrdered;

老实说,即使罗斯琳,我也不认为你能做到这一点。

顺便说一句,我强烈建议您从枚举类型中删除E前缀。 Ick:)