我有一个项目,它在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语句分支的唯一区别是生成的变量集合的类型?
如果要在运行时创建已知类型的静态类型对象集合,则需要使用反射.请参阅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)
| 归档时间: |
|
| 查看次数: |
1688 次 |
| 最近记录: |