繁体   English   中英

字典的通用/ DRY方式<string, T>

[英]Generic/DRY way to return Dictionary<string, T>

我有一个CSV解析器,它逐行接受文本并将其解析为值。 我试图将这些值放在Dictionary<string, T>并返回它,其中T是CharacterStatElement类的后代。 确实知道我在解析CSV时希望T是哪个类,但是我不想多次重写/复制同一解析器函数来覆盖我想从中返回的每个Type。

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

有关CharacterStatElement的更多信息:每个子类都包含几个字段,这些字段是我在使用反射进行解析时得出的。 每个子类都有不同的值,但是应该以相同的方式解析所有子类。 此外,每次单击仅发生一次,而不是循环执行,因此速度不是问题。 提取方法的肉以将其包装在非泛型方法中对我没有多大帮助,因为大多数解析方法都与我使用反射的类型有关。

您可以使用通用方法。 为了在类型参数上使用反射,您可以使用typeof(T)获得一个Type对象。 这样,您可以实例化该类型并动态设置属性。 对于泛型而言,这是一个相当糟糕的情况。 如果您只是使用object而不是T那么几乎所有的工作都将以相同的方式进行。 这表明不需要泛型。

您还可以将“策略”传递给通用函数,该通用函数知道如何将原始解析的字段(可能是string[] )转换为T 该策略将是Func<string[], T> 这样,根本就没有反射,这是泛型的干净用例。

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

我建议CharacterStatElement类具有一种知道如何解析输入行其余部分的方法。 每个派生类都将被重写以执行其特定的解析过程。 将任何辅助方法添加到基类,以便最小化派生类中所需的编码。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM