2015-02-09 55 views
0

我有一个CSV分析器,它逐行接收文本并将其解析为值。我试图把这些值放在Dictionary<string, T>并返回它,其中T是CharacterStatElement的后裔。我想知道当我解析CSV时我想要T是什么类,但是我不想重复/复制同一个解析器函数几次,以涵盖我想要从中返回的每个类型。通用/干方式返回词典<string, T>

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

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

+0

你知道你可以用来解析'.CSV'文件的许多强大的函数..例如'string.Split()'函数允许这种性质的事情,你可以创建一个类适合或模仿文件结构... – MethodMan 2015-02-09 23:04:32

+0

如果它始终受到CharacterStatElement的蹂躏,那么为什么不返回/传递字符串的字典=> CharacterStatElement – pm100 2015-02-09 23:15:22

+0

我实际上使用string.Split,它是知道什么类型投入字段,我在课堂上通过了反思。 – Arcandio 2015-02-09 23:57:16

回答

1

您可以使用通用方法。为了在类型参数上使用反射,您可以使用typeof(T)得到一个Type对象。这样你可以实例化该类型并动态地设置属性。对于泛型而言,这是一个相当不好的情况。如果你只是使用object而不是T,所有东西都会以相同的方式工作。这是一个不需要泛型的标志。

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

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

+0

是的,最终,我最终使用字典<字符串,对象>,一旦我找出了我的铸造问题。 – Arcandio 2015-02-10 16:06:27

1

我会建议CharacterStatElement类有一个知道如何解析输入行剩余部分的方法。每个派生类都被覆盖以执行其特定的解析过程。将任何帮助器方法添加到基类,以尽量减少派生类中所需的编码。

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

+0

然后我想我会只写几个实用函数来将分割字符串解析为实际值,并根据我需要从中得到的类型在它们之间切换,嗯?这可能值得一试,但我想我必须分别解析每个领域...... – Arcandio 2015-02-10 02:50:25

相关问题