【问题标题】:Storing variable type and using it to create collections at runtime存储变量类型并在运行时使用它来创建集合
【发布时间】:2011-07-09 04:38:25
【问题描述】:

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

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

在读取值进行分析时,使用如下 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;
}

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

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

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

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

这当然行不通,导致Type or namespace name expected 错误。

不幸的是,在我寻找解决方案时,我对使用 Type 类、泛型和匿名类型不太熟悉(似乎没有什么是合适的)。

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

【问题讨论】:

标签: c# types


【解决方案1】:

如果要创建运行时已知类型的对象的静态类型集合,则需要使用反射。参见即this blog entry - 这是创建List&lt;T&gt; 的解决方案:

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

【讨论】:

  • +1。我来这里是为了输入这个:)。不过,请记住考虑如何抽象“从 DB 中填充列表”步骤。因为如果你为此使用 switch 语句或其他东西,它有点违背了目的。
  • @A.:这非常有帮助,因此我将其标记为已接受。我通过创建一个List&lt;MyObject&gt; 解决了这个问题,其中MyObject 包含object 类型,并将类型作为参数传递给检索数据的方法,基本上将switch 语句移动到一个更小、更易于维护的部分。跨度>
【解决方案2】:

为什么需要类型化集合?为什么不使用 ArrayList?

ArrayList list = new ArrayList()

list.Add( /* value read from database */ )

【讨论】:

  • 也许它不需要是一个类型化的集合。你能举例说明你的意思吗?
  • 我认为他的意思是,由于您拥有 FieldName(我假设您使用它从数据库中提取数据),因此您根本不需要知道数据的类型。您可以只提取数据并将其存储在任何东西中,无论是 ICollection 还是 ArrayList。
猜你喜欢
  • 2019-02-19
  • 2013-03-02
  • 1970-01-01
  • 2013-12-11
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2013-05-19
相关资源
最近更新 更多