Generic / DRY方式返回Dictionary <string,t =“”> </string,>

时间:2015-02-09 22:58:51

标签: c# csv generics dictionary

我有一个CSV解析器,它逐行获取文本并将其解析为值。我正在尝试将这些值放在Dictionary<string, T>中并返回它,其中T是类CharacterStatElement的后代。当我解析CSV时,我知道我想要什么类,但是我不想多次重写/ copypaste相同的解析器函数来覆盖我想要返回的每个类型从它。

我应该为整个事情编写一个通用方法(如果是这样,我如何在Method中声明并返回?)或者我应该在这里做其他模式吗?

有关CharacterStatElement的更多信息:每个子类都包含几个字段,我在使用反射进行解析时会弄清楚这些字段。每个子类都有不同的值,但它们应该以相同的方式解析。此外,这只发生一次按钮点击,而不是循环,所以速度不是问题。并且提取方法的内容以将其包装在非泛型方法中对我没有多大好处,因为大多数解析方法都与我使用反射的预期类型相关联。

2 个答案:

答案 0 :(得分:1)

您可以使用通用方法。要在类型参数上使用反射,您可以使用Type获取typeof(T)对象。这样,您可以实例化该类型并动态设置属性。对于泛型来说,这是一个相当糟糕的情况。如果您只使用object代替T,那么一切都会以同样的方式运作。这是一个标志,不需要泛型。

您还可以将“策略”传递到通用函数中,该函数知道如何将原始解析字段(可能是string[])转换为T。该策略将是Func<string[], T>。这样就没有任何反思,这对于泛型来说是一个干净的用例。

或者,让CSV解析器返回IEnumerable<string[]>并处理转换为CSV解析方法之外的T

答案 1 :(得分:1)

我建议CharacterStatElement类有一个知道如何解析剩余输入行的方法。重写每个派生类以执行其特定的解析过程。将任何辅助方法添加到基类中,以最大限度地减少派生类中所需的编码。

然后按以下方式处理CSV文件的每一行。解析开始,为您提供决定正确类以解析整行所需的信息。然后创建一个正确派生类的实例并传入该行进行处理。然后将值添加到全局字典中。简单。