存储变量类型并使用它在运行时创建集合

JYe*_*ton 3 c# types

我有一个项目,它在SQL中存储值,然后检索它们进行分析.为了跟踪可能存储的值类型,我创建了一个大致如下的类:

private class DataField
{
    public string FieldName;
    public string FieldType;
}
Run Code Online (Sandbox Code Playgroud)

在读取值进行分析时,使用switch语句如下(简化):

switch (DataField.FieldType)
{
    case "int":
        List<int> InputData = new List<int>();
        // Populate list from DB
    break;
    case "bool":
        List<bool> InputData = new List<bool>();
        // Populate list from DB
    break;
}
Run Code Online (Sandbox Code Playgroud)

我没有在多个地方维护代码,而是在寻找摆脱switch语句的方法,但这意味着我需要根据类型动态创建集合.当前该类型是(天真地?)一个字符串,但我想我可以通过更改类来改进它:

private class ImprovedDataField
{
    public string FieldName;
    public Type FieldType;
}
Run Code Online (Sandbox Code Playgroud)

然后以某种方式动态创建集合:

Type DataType = typeof(DataField.FieldType);
List<DataType> InputData = new List<DataType>();
// Populate list from DB
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,导致Type or namespace name expected错误.

不幸的是Type,当我寻找解决方案时,我不熟悉使用该类,也不熟悉泛型或匿名类型(似乎没有什么是合适的).

如何减少代码重复,其中每个switch语句分支的唯一区别是生成的变量集合的类型?

NOt*_*Dev 5

如果要在运行时创建已知类型的静态类型对象集合,则需要使用反射.请参阅ie 博客条目 - 这是创建的解决方案List<T>:

public static IList CreateGenericList(Type collectionType)
{
    var listType = typeof(List<>).MakeGenericType(new[] { collectionType});
    return (IList) Activator.CreateInstance(listType);
}
Run Code Online (Sandbox Code Playgroud)

所以在你的例子中:

Type dataType = DataField.FieldType;
IList inputData = CreateGenericList(dataType);
// Populate list from DB
Run Code Online (Sandbox Code Playgroud)