我想要一个 C# 方法来计算 switch 语句中的案例数。 (我们称之为 CaseCounter
)。例如,假设您有这个枚举和这两个方法:
enum Painter
{
Rubens,
Rembrandt,
Vermeer,
Picasso,
Kandinsky
}
int GetYearOfBirth(Painter painter)
{
switch(painter)
{
case Painter.Kandinsky:
return 1866;
case Painter.Picasso:
return 1881;
case Painter.Rembrandt:
return 1606;
case Painter.Rubens:
return 1577;
case Painter.Vermeer:
return 1632;
default:
return 0;
}
}
bool IsModern(Painter painter)
{
switch (painter)
{
case Painter.Kandinsky:
case Painter.Picasso:
return true;
default:
return false;
}
}
现在应满足以下等式:
CaseCounter("GetYearOfBirth") == 5
CaseCounter("IsModern") == 2
(是否在计数中包含默认情况并不重要。此外,
CaseCounter
的参数不需要是字符串;任何可以以某种方式用于表示方法的类型都可以。)那么,您将如何实现
CaseCounter
?甚至有可能吗?--- 附录(编辑)---
这里有一些背景信息,以防你想知道我为什么问这个问题。
我正在维护一个代码库,其中包含许多打开枚举的方法。这些方法分布在各个类中;当枚举扩展时(例如,当您添加新的
Painter
时),这会使生活变得困难。为了使维护更容易一些,我编写了以下形式的一些单元测试:// If this test fails please check that the following methods are still OK:
// MyClass.GetYearOfBirth, MyOtherClass.IsModernAllCases .
// (There is no guarantee that the above list is up-to-date or complete.)
[Test]
public void PainterCountTest()
{
int numberOfMembers = Enum.GetValues(typeof(NotificationID)).Length;
Assert.AreEqual(5, numberOfMembers);
}
(在这个例子中,
IsModernAllCases
只是 IsModern
的一个变体,它明确地引用了 Painter
枚举的所有 5 个可能的值。)这个测试总比没有好,但它很笨拙。如果你能写出这样的东西,就不会那么笨拙了:
[Test]
public void PainterCountTest()
{
int numberOfMembers = Enum.GetValues(typeof(NotificationID)).Length;
int numberOfCases_getYearOfBirth = CaseCounter("MyClass.GetYearOfBirth");
Assert.AreEqual(numberOfCases_getYearOfBirth, numberOfMembers);
int numberOfCases_modern = CaseCounter("MyOtherClass.IsModernAllCases");
Assert.AreEqual(numberOfCases_modern, numberOfMembers);
}
在这种情况下,至少在扩展枚举时不必修改单元测试。
最佳答案
应该可以使用 the Roslyn CTP - Microsoft 的编译器即服务预发布产品。它具有 API,可让您检查 C# 代码并将其表示为指令树。不幸的是,它是一个 CTP,这对您来说可能是也可能不是问题 - 如果您尝试使用它,请记住它是预发布软件。
如果您不能使用 Roslyn,我认为唯一的方法是检查生成的 IL。至少可以说,这是一项艰巨的任务。我没有任何示例代码,但如果你想尝试它 - 我会从查看 Cecil Mono 项目开始,它有一些用于检查 IL 的 API。
您也可以使用 MethodInfo.GetMethodBody
获取原始 IL 字节,然后自己解析这些字节,但这确实需要一些工作才能做到这一点。
另请参阅 this related question 。
关于c# - 计算 switch 语句中的 case 数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12203872/