C#中的“虚拟”切换语句?

时间:2014-01-26 22:06:15

标签: c# inheritance switch-statement

我正在编写一个读取文本文件的类,并根据它创建一些数据结构。我无法控制文件格式,但它是一致的,我有很多例子。我时不时地遇到一个页眉。我从标题中拉出一个字符串,然后通知我对页面其余部分的操作。我使用这样的开关语句:

private void ReadPage(headerKey)
{
    switch (headerKey)
    {
        case "a header": DoThis(headerKey); return;
        case "another header": DoThat(headerKey, "A"); return;
        case "header 3": DoThat(headerKey, "B"); return;
        // 10-20 more cases
    }
}

它运行良好,但现在我已经使这个类抽象并创建了两个子类。 switch语句中有一些情况适用于两个子类,但每个都有一些独特的情况。我试图以一种看起来很漂亮的方式编写代码。我可以使用一个填充它的虚拟方法的字典,但是它的语法是如此丑陋,我有为每个类的实例创建一个字典的开销。

private readonly Dictionary<string, Action<string>> headerKeyCases();

private A()
{
    headerKeyCases = new Dictionary<string, Action<string>>(GetVariableGridParsersByName);
}

protected virtual IEnumerable<KeyValuePair<string, Action<string>>> GetVariableGridParsersByName()
{
    yield return new KeyValuePair<string, Action<string>>("a header", headerKey=> DoThis(headerKey));
    yield return new KeyValuePair<string, Action<string>>("another header", headerKey=> DoThat(headerKey, "A"));
    yield return new KeyValuePair<string, Action<string>>("header 3", headerKey=> DoThat(headerKey, "B"));
    // 10-20 more cases
}

有更清洁的方法可以做到这一点,还是我只是太挑剔了?

1 个答案:

答案 0 :(得分:1)

private readonly Dictionary<string, Action<string>> headerKeyCases;

private A()
{
    headerKeyCases = GetVariableGridParsersByName();

    // Add another
    headerKeyCases["another case"] = headerKey => DoSomething(headerKey, "C");
}

protected virtual void GetVariableGridParsersByName()
{
    return new Dictionary<string, Action<string>>({
        { "a header", DoThis },
        { "another header", headerKey => DoThat(headerKey, "A") }
        // etc.
    });
}