【问题标题】:Generic/DRY way to return Dictionary<string, T>返回 Dictionary<string, T> 的通用/DRY 方式
【发布时间】:2015-02-09 22:58:51
【问题描述】:

我有一个 CSV 解析器,它逐行获取文本并将其解析为值。我试图将这些值放在Dictionary&lt;string, T&gt; 中并返回它,其中 T 是 CharacterStatElement 类的后代。我确实知道我在解析 CSV 时希望 T 成为什么类,但我不想多次重写/复制相同的解析器函数来覆盖我想要返回的每个类型来自它。

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

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

【问题讨论】:

  • 您是否知道在解析.CSV 文件时可以使用许多强大的函数......例如string.Split() 函数允许这种性质的事情,您可以创建一个类适合或模仿文件结构...
  • 如果它总是来自 CharacterStatElement 那么为什么不返回/传递一个字符串字典=>CharacterStatElement
  • 我实际上是在使用 string.Split,它知道将字段转换为什么类型,我对传入的类使用反射。
  • @pm100 我读到我不能将 CharacterStatElement 转换为子类型。这就是我认为我现在几乎正在工作的内容,但我想不出一种方法来让对象在以后恢复为子类型。
  • 确保您可以将基类型转换为子类型,var child = base as ChildType,如果它不是有效的转换(即基不是 ChildType 的实例),则 child 将为 null跨度>

标签: c# csv generics dictionary


【解决方案1】:

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

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

或者,让 CSV 解析器返回一个 IEnumerable&lt;string[]&gt; 并在 CSV 解析方法之外处理到 T 的转换。

【讨论】:

  • 是的,最终,我最终使用了 Dictionary,一旦我弄清楚我的转换问题是什么。
【解决方案2】:

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

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

【讨论】:

  • 那我想我会写几个实用函数来将拆分的字符串解析为实际值,并根据我需要从它们那里得到的类型在它们之间切换,嗯?这可能值得一试,但我认为我必须单独解析每个字段......
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
相关资源
最近更新 更多