自定义枚举类型

时间:2011-06-09 16:25:51

标签: c# visual-studio-2010 c#-4.0 language-features

我有一个基于标志的枚举,虽然它目前没有超过64值(长)的界限,但它可能会。

我正在使用枚举来描述我们的客户MEF插件/组件的用途。这将是我们实施客户定制的主要机制。

我很确定我的老板不会对我们只能为64位客户提供服务的想法感到满意,但如果没有Enum,我就无法实现这样一个灵活的系统。

理想情况下,我想写一下:

[Flags]
public enum Organisations : MyBinaryFormat
{
    // Customers
    CustomerA = 1 << 0,
    CustomerB = 1 << 1,
    CustomerC = 1 << 2,
    CustomerD = 1 << 3,

    // Special
    Any                 = CustomerA | CustomerB | CustomerC,
    HostedCustomers     = CustomerA | CustomerC,
}

这是一个非常方便的语法来定义我的元数据,不幸的是,黑客攻击类型并不是我真正的强项,所以我尽力研究/试验这个主题,但没有达到目的:

  • This问题说可以将BitArray类与枚举一起使用,这是理想的但是没有提供实现。

  • 我看到VS2008文档中使用的TypeDef已传入枚举here。在示例中,它只是屏蔽了bool类型,看起来该关键字已被删除。

  • 我搜索过多个msdn“enum”页面(我不愿意说'全部',但为了自己的利益,我看到的太多了)。但是this page说要考虑使用System.Int32作为数据类型,除非枚举是一个标志枚举,并且你有超过32个标志。

  • 然而,每当我尝试使用一个时,我会一直得到“Error1:输入byte,sbyte,short,ushort,int,uint,long或ulong”的异常自定义类型。 我没有看到任何(除了我的例外)明确表示你不能使用自己的自定义数据类型,但我也没有找到它的单一实现。

我想明确知道是否可以在自定义类型上构建枚举

2 个答案:

答案 0 :(得分:3)

定义包含CustomerID列表甚至只是CustomerList的{​​{1}}类有什么问题? .NET API有许多List操作方法,允许您将客户ID列表与OR一起,就像使用标志枚举一样。

e.g。

List<int>

答案 1 :(得分:1)

将它们表示为代表客户ID的唯一字符串(或数字)数组会不会更好?

例如,您可以定义一个元数据界面,如:

public interface ICustomerValidityMetadata
{
    string[] ValidCustomers { get; }
}

您可以将其转换为元数据属性:

[MetadataAttribute]
public class ExportForCustomerAttribute : ExportAttribute, ICustomerValidityMetadata
{
    public ExportForCustomerAttribute(Type type, params string[] customerIds)
        : base(type)
    {
        ValidCustomers = customerIds ?? new string[0];
    }
}

然后您可以申请:

[ExportForCustomer(typeof(IModule), "CustomerA", "CustomerB")]
public class SomeModule : IModule { }

然后你可以过滤:

var modules = container.GetExports<IModule, ICustomerValidityMetadata>()
    .Where(l => l.Metadata.ValidCustomers.Contains("CustomerA");

但是,老实说,可变实体的硬编码表示是一个坏主意,你应该从数据库或配置等动态地进行动态查找。这样你只需要导出一些表示模块Id的元数据然后,您可以针对特定客户查找它是否可用。

希望有所帮助。