我正在使用查找表进行引用。例如注册类型,管理员,主持人然后使用工厂确定注册类型。创建比较注册的强类型方法的最简单方法是什么。对枚举的类似行为的排序。例如
pssudo代码
class regfactory
{
case()
if(regType.Admin: return new adminReg()
}
我能想到的唯一方法是从数据库生成的魔术字典词典。
答案 0 :(得分:4)
我认为,为您的情况完成强类型枚举的唯一方法是代码生成。在编译时之前没有生成的任何内容都不能用于强类型。
Robert Koritnik发布了一个非常流畅的方法:T4 template to Generate Enums
另一种生成'更好的可读枚举名称(如果您需要它们)是https://github.com/MehdiK/Humanizer的HUmanizer项目。
答案 1 :(得分:0)
从实际的角度来看,它可能看起来有点容易出错,您可能觉得自己违反了一些良好的实践规则,没有集中访问该数据并使其面临失去同步的风险但是,从架构的角度来看,考虑到我们正在讨论查找数据,可以对其进行硬编码,因为它只是您的一部分。静态数据合同",如果你愿意的话。
如果你确实有很多这些,那么可能有一种情况可以将这些常量放在一个格式中,在这些格式中,当这些值发生变化时,构建或数据库补丁脚本可以更新它们,但是9个中有9个只是填充它们enum工作正常。
值得注意的是,某些ORM确实对枚举有很好的支持,包括EF,如果采用代码优先方法,它将允许保持这些值同步。但是,我们正在谈论为您的软件添加一个全新的层,因此您必须拥有更多的理由,而不仅仅是希望保持静态查找数据同步以实现它。
答案 2 :(得分:0)
您可以在c#中使用反射。在this answer上有一个很好的例子可以列出给定命名空间中声明的类。
然后,您可以将注册类型的名称与可用类的名称进行比较,以确定要实例化的类。