2014-09-25 62 views
0

我正在使用查找表作为参考。例如注册类型,管理员,主持人然后使用工厂来确定注册的类型。创建比较注册的强类型方法的最简单方法是什么?与枚举类似的行为。例如数据库查找表枚举或类似

pssudo代码

class regfactory 
{ 
    case()   
     if(regType.Admin: return new adminReg()  
} 

我能想到的唯一的办法就是从数据库中生成的神奇字符串的字典。

+0

我不认为我理解这个问题是正确的。但是当我在数据库的一个表中使用类型时,我在C#中创建了一个与之匹配的枚举。因此,如果在数据库中,我有一个表“RegistrationType”的行“1,管理员”,“2,主持人”...这些数字是表中的主键,所以我可以将它翻译为C#“enum:int {Admin = 1,主持人= 2,...}然后按照你的建议键入。 – Sasse 2014-09-29 07:26:18

回答

4

我想你的情况下完成强类型枚举的唯一方法就是代码生成。任何在编译之前不会生成的东西都不适用于强类型。

罗伯特Koritnik发布了非常光滑的方式来做到这一点:T4 template to Generate Enums

另一种方式来“产生”更好的可读性枚举名称(如果你需要他们)是在https://github.com/MehdiK/Humanizer的HUmanizer项目。

0

从实际的角度来看,它可能看起来有点容易出错,你可能觉得你打破了一些良好的实践规则,不集中访问这些数据并使其在维护期间有可能不同步但是,从架构的角度来看,考虑到我们正在讨论查找数据,如果您愿意,可以将它硬编码为“静态数据合同”的一部分,这是可以的。

如果你确实有很多这些常量,那么可能会出现这样的情况,即将这些常量放在一个格式中,当这些值发生变化时,构建或数据库补丁脚本可以更新它们,但是只有9个填充它们在一个枚举工作正常。

值得注意的是,一些ORM确实对枚举有很好的支持,包括EF,如果采用代码优先的方法,可以保持这些值同步。但是,我们正在讨论为软件添加一个全新的层,因此您必须拥有更多的理由,而不仅仅是希望保持静态查找数据同步来实现这一点。

0

您可以在c#中使用反射。在this answer上有一个很好的例子来列出给定名称空间中的声明类。

然后,您会将您的注册类型的名称与可用类的名称进行比较,以确定要实例化哪个类。