Generic/DRY 通往 return 词典的方式<string, T>

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

我有一个 CSV 解析器,它逐行获取文本并将其解析为值。我试图将这些值放在 Dictionary<string, T> 和 return 中,其中 T 是 class CharacterStatElement 的后代。我 知道 class 当我解析 CSV 时我希望 T 是什么,但我不想 rewrite/copypaste 多次使用相同的解析器函数涵盖我想要从中 return 的每个类型。

我应该为整个事情编写一个通用方法(如果是这样,我如何在方法和 return 中声明它?)还是我应该做一些其他模式这里?

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

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

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

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

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

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