【问题标题】:How can I create a data structure containing properties whose types are defined at runtime如何创建包含其类型在运行时定义的属性的数据结构
【发布时间】: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 有合理的理解,但不确定在这种情况下如何使用它们。我听说过 ReflectionType 类和 dynamic 关键字,但并不真正了解它们。我曾尝试使用字典,但一直卡住。这些选项是否可行?他们是不是矫枉过正?这是我想太多了吗? 请帮帮我!:D

谢谢!

【问题讨论】:

  • 您是否有一组固定的 csv 文件要处理,或者您是否正在处理具有随机数量的列和数据类型的大量 csv?即你能说..这是报告类型1、2、3等..然后每个都有一组已知的列?
  • 另外,您是否考虑过使用字符串进行初始 csv 加载?
  • @Wheels73 CSV 文件不受我控制。它们将由用户提供。所以我不知道列的数量和它们应该存储的类型。我最初可以将 CSV 文件值作为字符串加载,但随后我需要将它们转换为用户定义的正确类型。
  • 您可以使用接口或基类并使用Reflection.Emit 引入新的派生类型。这种方法有其魅力,但在复杂性方面可能代价高昂。
  • 您还需要这方面的帮助吗?

标签: c# generics dynamic reflection


【解决方案1】:

当您阅读 csv 文件时,您可能会得到一个包含字典的列表。 小例子...

List<Dictionary<string, object> yourDataInAList = new List<Dictionary<string, object>();
//... you now read the csv file and iterate the file
Dictonary<string, object> dynamicDataStructure = new Dictonary<string, object>();
// ... you iterate now through the values in the entry ...
dynamicDataStructure.Add(yourHeaderName, yourValue);
// ... at the end of the itereation through the values in the entry we have to add
// this dic in the list
yourDataInAList.Add(dynamicDataStructure);

没有复杂性,但有很大的灵活性 :) 但您必须注意,标题中不应有多个相同的名称...

【讨论】:

  • 那么,您是否建议在需要时将对象转换为适当的类型?我想我还必须存储用户指定的标题名称和类型的字典(我可以将其设为常见类型的枚举)。然后,每当我需要对数据执行特定类型的操作时,我可以检查标题名称和类型的字典,然后转换为指定的类型。我认为这会起作用,但感觉真的很乱,而且我认为这会导致其他问题......嗯......:\
  • 您可以使用“as”并检查变量是否为空,例如 int i = dynamicDataStructureObject as int if(i != null) // i 是一个 int :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2017-12-24
  • 2018-05-09
  • 1970-01-01
相关资源
最近更新 更多