我正在编写一个读取文本文件的类,并根据它创建一些数据结构。我无法控制文件格式,但它是一致的,我有很多例子。我时不时地遇到一个页眉。我从标题中拉出一个字符串,然后通知我对页面其余部分的操作。我使用这样的开关语句:
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
}
有更清洁的方法可以做到这一点,还是我只是太挑剔了?
答案 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.
});
}