1

是否可以在 switch 的所有情况下以编程方式检索?我不知道,也许是 IL 但不知道该怎么做......

事实上,我的全球问题如下:我得到了一个带有字符串作为属性名称的 siwtch 案例。方法很重要,不允许回归。我不希望重构破坏这一点,所以我想要一种方法来测试所有大小写字符串实际上是我的对象的真实属性。(注意:默认值返回一些东西,所以我不能为重构的无效值抛出异常)。

4

4 回答 4

2

有一些方法可以避免在代码中直接使用属性名称作为字符串。我在这里发布了一个代码片段。

然后,不要使用 switch 语句,而是实现如下内容:

private IDictionary<string, Action> _actions;

public void RegisterAction(string propertyName, Action action)
{
    _actions.Add(propertyName, action);
}

public void DoSomething(string propertyName)
{
    _actions[propertyName]();
}

调用这两种方法时,请确保使用代码片段的 Member 类(请参阅链接),而不是直接使用属性名称。因此,您可以确保您的代码是可重构的,因为它不包含任何“魔术字符串”。

最好的祝福

于 2009-09-01T08:28:21.110 回答
2

在 IL 中,switch 语句编译为如下内容:

// ...
L_000c: ldloc.1 
L_000d: ldstr "case1"
L_0012: call bool [mscorlib]System.String::op_Equality(string, string)
L_0017: brtrue.s L_0035
L_0019: ldloc.1 
L_001a: ldstr "case2"
L_001f: call bool [mscorlib]System.String::op_Equality(string, string)
L_0024: brtrue.s L_0042
L_0026: ldloc.1 
L_0027: ldstr "case3"
L_002c: call bool [mscorlib]System.String::op_Equality(string, string)
L_0031: brtrue.s L_004f
// ...

编写可以在所有情况下正确分析这一点的代码将是相当多的工作。

我可以看到测试这一点的唯一方法是实际涵盖所有情况并确保您最终不会得到空的 PropertyInfo。如果您正在使用的代码非常重要并且不会失败,那么在任何情况下使用反射都可能非常危险。你能转向更安全的设计吗?

于 2009-09-01T08:36:28.160 回答
1

获取开关中的值并非易事......

如果您在开关中使用枚举而不是字符串,则可以使用 轻松获取枚举的值Enum.GetValues

于 2009-09-01T08:23:04.910 回答
0

用 AWK 或 Perl 或其他任何方式编写一个脚本来检查源代码本身,并在每次构建之前运行它。

于 2009-09-01T08:52:03.603 回答