我有一个基于标志的枚举,虽然它目前没有超过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”的异常自定义类型。 我没有看到任何(除了我的例外)明确表示你不能使用自己的自定义数据类型,但我也没有找到它的单一实现。
我想明确知道是否可以在自定义类型上构建枚举
答案 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的元数据然后,您可以针对特定客户查找它是否可用。
希望有所帮助。