C# 如何创建包含在运行时定义其类型的属性的数据结构

C# 如何创建包含在运行时定义其类型的属性的数据结构,c#,generics,dynamic,reflection,C#,Generics,Dynamic,Reflection,我正在开发一个数据可视化工具。它从纯文本文件中检索一组数据,然后绘制这些数据的各种图表 到目前为止,我一直在处理一组我知道类型的数据 例如,如果我使用的CSV文件如下所示: public class SomeClass { private string id; private string username; private int numberOfMessages; private string message; } public class SomeClas

我正在开发一个数据可视化工具。它从纯文本文件中检索一组数据,然后绘制这些数据的各种图表

到目前为止,我一直在处理一组我知道类型的数据

例如,如果我使用的CSV文件如下所示:

public class SomeClass
{
    private string id;
    private string username;
    private int numberOfMessages;
    private string message;
}
public class SomeClass
{
    private string someString;
    private int someInt;
    private bool someBool;
}
id、用户名、消息数、消息
23123124,@SomeUsername,5,这是一个5tr1ng
89134349,@AnotherUsername,8,另一个字符串

然后我可以将其存储在如下对象中:

public class SomeClass
{
    private string id;
    private string username;
    private int numberOfMessages;
    private string message;
}
public class SomeClass
{
    private string someString;
    private int someInt;
    private bool someBool;
}
然后我就有了一个
列表

这是伟大的一切,但它将只适用于特定的CSV文件。我希望有一个灵活的数据结构,这取决于CSV文件的内容

通过读取文本文件第一行的标题行,可以很容易地发现属性的数量和这些属性的名称。每个数据段的类型不清楚(例如,id可以存储为int或字符串),因此我将要求用户告诉应用程序每个属性使用什么类型。我可以通过在下拉列表旁边显示每个属性的名称来实现,下拉列表中有string、int、bool等选项

但是我如何接受用户输入并创建包含这些类型属性的数据结构呢。因此,如果用户浏览包含3个下拉列表的表单并选择“String”、“Integer”和“Boolean”,我实际上想要一个如下所示的对象:

public class SomeClass
{
    private string id;
    private string username;
    private int numberOfMessages;
    private string message;
}
public class SomeClass
{
    private string someString;
    private int someInt;
    private bool someBool;
}
实现这一目标的最佳方式是什么?我对泛型有合理的理解,但不确定在这种情况下如何使用它们。我听说过反射类型类和动态关键字,但我并不真正理解它们。我试过使用字典,但总是被卡住。这些选择是否可行?他们是不是杀得过火了?我是不是想得太多了<请帮帮我:D


谢谢大家!

当您读取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);

list您是否有一组固定的csv文件需要处理,或者您正在处理一系列随机列数和数据类型的csv文件?i、 你能说。。这是报告类型1、2、3等。。每一个都有一组已知的列?另外,您是否考虑过在初始csv加载时使用字符串?@Wheels 73 csv文件不在我的控制范围内。它们将由用户提供。因此,列的数量以及它们应该存储为什么类型对我来说是未知的。我最初可以将CSV文件值作为字符串加载,但随后需要将它们转换为用户定义的正确类型。您可以使用接口或基类,并使用
反射.Emit
引入新的派生类型。这种方法有它的魅力,但在复杂性方面可能很昂贵。您还需要帮助吗?因此,您是否建议在需要时将对象强制转换为适当的类型?我想我还必须存储一个由用户指定的头名称和类型的字典(我可以将其作为常见类型的枚举)。然后,每当我需要对数据执行特定于类型的操作时,我都可以检查头名称和类型的字典,然后转换为指定的类型。我认为这会起作用,但感觉真的很混乱,而且我认为这会导致其他问题。。。嗯…:\您可以使用“as”并检查变量是否为null,如int i=dynamicDataStructureObject as int if(i!=null)//i是int:)