我想要一个 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
(是否在计数中包含默认情况并不重要。此外,参数 toCaseCounter
不需要是字符串;任何可以以某种方式用于表示方法的类型都可以。)
那么,您将如何实施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
的所有 5 个可能值。)Painter
这个测试总比没有好,但它很笨拙。如果你能写这样的东西,那就不会那么笨拙了:
[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);
}
在这种情况下,至少您在扩展枚举时不必修改单元测试。