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

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

private class DataField { public string FieldName; public string FieldType; } 

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

 switch (DataField.FieldType) { case "int": List InputData = new List(); // Populate list from DB break; case "bool": List InputData = new List(); // Populate list from DB break; } 

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

 private class ImprovedDataField { public string FieldName; public Type FieldType; } 

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

 Type DataType = typeof(DataField.FieldType); List InputData = new List(); // Populate list from DB 

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

不幸的是,我不太熟悉使用Type类,也没有generics或匿名类型,因为我搜索解决方案(似乎没有什么是合适的)。

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

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

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

所以在你的例子中:

 Type dataType = DataField.FieldType; IList inputData = CreateGenericList(dataType); // Populate list from DB 

你为什么需要一个打字的collections? 为什么不使用ArrayList?

 ArrayList list = new ArrayList() list.Add( /* value read from database */ )