【发布时间】:2017-08-20 10:25:48
【问题描述】:
我正在开发一种数据可视化工具。它从纯文本文件中检索一堆数据,然后绘制该数据的各种图表。
到目前为止,我一直在处理一组我知道其类型的数据。
例如,如果我正在使用如下所示的 CSV 文件:
id、用户名、消息数量、消息
23123124, @SomeUsername, 5, This 1s a 5tr1ng
89134349,@AnotherUsername,8,另一个字符串
然后我可以将它存储在这样的对象中:
public class SomeClass
{
private string id;
private string username;
private int numberOfMessages;
private string message;
}
那我只有一个List<SomeClass>。
一切都很好,但它只适用于那个特定的 CSV 文件。我希望有一个灵活的数据结构,具体取决于 CSV 文件的内容。
通过阅读文本文件第一行的标题行很容易发现属性的数量和这些属性的名称。不清楚每条数据的类型(例如,id 可以存储为 int 或字符串),因此我将要求用户告诉应用程序每个属性使用什么类型。我可以通过在带有字符串、int、bool 等选项的下拉列表旁边显示每个属性的名称来做到这一点。
但是我如何获取用户输入并创建包含这些类型的属性的数据结构。因此,如果用户通过一个带有 3 个下拉菜单的表单并选择“String”、“Integer”和“Boolean”,我实际上想要一个如下所示的对象:
public class SomeClass
{
private string someString;
private int someInt;
private bool someBool;
}
实现这一目标的最佳方法是什么?我对 Generics 有合理的理解,但不确定在这种情况下如何使用它们。我听说过 Reflection、Type 类和 dynamic 关键字,但并不真正了解它们。我曾尝试使用字典,但一直卡住。这些选项是否可行?他们是不是矫枉过正?这是我想太多了吗? 请帮帮我!:D
谢谢!
【问题讨论】:
-
您是否有一组固定的 csv 文件要处理,或者您是否正在处理具有随机数量的列和数据类型的大量 csv?即你能说..这是报告类型1、2、3等..然后每个都有一组已知的列?
-
另外,您是否考虑过使用字符串进行初始 csv 加载?
-
@Wheels73 CSV 文件不受我控制。它们将由用户提供。所以我不知道列的数量和它们应该存储的类型。我最初可以将 CSV 文件值作为字符串加载,但随后我需要将它们转换为用户定义的正确类型。
-
您可以使用接口或基类并使用
Reflection.Emit引入新的派生类型。这种方法有其魅力,但在复杂性方面可能代价高昂。 -
您还需要这方面的帮助吗?
标签: c# generics dynamic reflection