【发布时间】:2010-11-12 07:13:04
【问题描述】:
我要问的问题与 How do you write code whose logic is protected against future additional enumerations? 有关,但可能更笼统。
为简单起见,我将只考虑这两个答案(1,2)question,因为我不想过多地重构代码。
Solution 1 当 switch 值是未专门处理的枚举值时,通过在 switch 语句的默认块中抛出运行时异常来处理这种情况。如果在测试期间发生这种情况,将提示开发人员重新检查代码并在 switch 语句中为该特定枚举值添加处理代码。
Solution 2 使用访问者模式来实现,因此如果使用该枚举的代码未更新以反映附加值,则任何添加枚举值都会创建编译时。
现在,两种解决方案都有效且良好。但是,我更喜欢编译时错误而不是运行时异常,以防我在测试期间的代码覆盖率跳过该部分。此外,在解决方案 2 上编写解决方案 1 之类的代码更自然(太冗长)。
因此我想知道是否有一种解决方案既具有解决方案 2 的编译时错误的优点又具有解决方案 1 中简单添加代码的优点?是否可以编写一些自定义属性来指定在开关中使用特定枚举时必须针对该开关中所有可能的枚举值进行检查,并让编译器在违反时抱怨。
[allValuesMustBeCheckedInSwitch]
enum Fruit {Apple, Banana, Coconut}
Fruit aFruit = Fruit.Apple;
switch (aFruit)
{
case Fruit.Apple:
//do something
break;
case Fruit.Banana:
//do something
break;
default:
break;
}
如果我可以在开关中添加类似的内容以选择性地禁用编译器错误(并可能将其更改为警告),那就更好了。
[checkOnly(Fruit.Apple,Fruit.Banana)]
我说我的问题更笼统,因为我想知道自定义属性的表现力如何,之前没有使用过属性。这个例子只是我想在我的代码中定义的一个特定限制,可能还有其他不同类型的限制。
如果有其他工具可以执行类似的任务,我也想知道。
【问题讨论】:
-
除 dllimport 外的属性只提供元数据,不提供 aop 样式横切。你可以使用 postsharp 伪造其中的一些东西,但是让它在编译时工作将不得不等待编译器即服务,现在可能不会出现在 c# 5 中
标签: c# custom-attributes