2014-11-21 122 views
1

我有一类具有枚举EnumParentAttribute和智能感知

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)如何添加,迫使我去装点一新EOrderStatusType项目与自定义属性“constarint” EnumParent?有一种方法可以让编译器在编译期间通知异常吗? 2)如何扩展EOrderStatusType枚举,以便我可以编写如下代码: OrderStatus.EOrderStatusType(P2)l_MyEnum = OrderStatus.EOrderStatus.FilmOrdered; Intellisense只显示“正确”父项的项目吗?

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

提前感谢!

回答

0

如何添加一个“constarint”,强制我使用自定义属性EnumParent修饰新的EOrderStatusType项目?有一种方法可以让编译器在编译期间通知异常吗?

两个选项:

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

如何可以扩展EOrderStatusType枚举,这样我可以写出这样的代码:OrderStatus.EOrderStatusType(P2)l_MyEnum = OrderStatus.EOrderStatus.FilmOrdered;

说实话,我认为即使与Roslyn也可以做到这一点。

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