![](/img/trans.png)
[英]What is the best way to clone/deep copy a .NET generic Dictionary<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.