将对象转换为DataColumn的类型

时间:2012-08-18 01:53:55

标签: c# casting datatable

我正在广泛使用字典来解耦一些(高度耦合的)代码。以下是我的问题的相关内容:

//Output table
System.Data.DataTable dtOutput = new System.Data.DataTable();
dtOutput.Columns.Add("Ticket", typeof(string));
dtOutput.Columns.Add("Transit", typeof(string));
dtOutput.Columns.Add("City", typeof(string));
dtOutput.Columns.Add("Province", typeof(string));
dtOutput.Columns.Add("Outage Start Time", typeof(DateTime));
dtOutput.Columns.Add("Outage End Time", typeof(DateTime));
dtOutput.Columns.Add("Priority", typeof(string));
dtOutput.Columns.Add("Business Impact", typeof(TimeSpan));
dtOutput.Columns.Add("Time To Repair (mins)", typeof(Double));
dtOutput.Columns.Add("Summary", typeof(string));

Dictionary<string, int> outputColumnsLegend = new Dictionary<string, int>();
foreach (DataColumn col in dtOutput.Columns)
{
    outputColumnsLegend.Add(col.ColumnName, dtOutput.Columns.IndexOf(col) + 1);
}

Dictionary<string, Variable> outputVariable = new Dictionary<string, Variable>()
{
    {"Ticket", new Variable()},
    {"Transit", new Variable()},
    {"City", new Variable()},
    {"Province", new Variable()},
    {"Outage Start Time", new Variable()},
    {"Outage End Time", new Variable()},
    {"Priority", new Variable()},
    {"Business Impact", new Variable()},
    {"Time To Repair (mins)", new Variable()},
    {"Summary", new Variable()}
};

其中变量只是:

public class Variable
{
    public object Value { get; set; }
}

现在,要创建我尝试使用的输出表:

DataRow dataRow = dtOutput.NewRow();
foreach (DataColumn col in dtOutput.Columns)
{
    dataRow[outputColumnsLegend[col.ColumnName]] = (col.DataType)outputVariable[col.ColumnName].Value;
}

但是, col.DataType 中对col的引用会导致此错误:

The type or namespace 'col' could not be found (are you missing a using directive or an assembly reference?)

我不知道为什么我会抛出此错误或如何修复它。此外,我不确定 col.DataType 是否应该 col.GetType (假设可以使其工作)。

感谢任何建议。

问候。

1 个答案:

答案 0 :(得分:1)

此代码没有最终结果。 因为DataTable将数据存储为对象(这就是为什么你必须在从中获取数据时进行转换),并且因为你的Variable()类拥有一个对象,所以任何数量的转换实际上都不会做任何有用的工作。

基本上,你是拆箱,然后立即在同一行重新装箱数据,即使演员阵容有效。

如果你想在运行时保留类型以避免这种情况(这可能是你想要的那样),那么你需要使你的变量类成为通用类,如下所示:

public class Variable<T>
{
   public T Value {get; set;}
}

然后,您将实例化特定类型的变量,例如:

Variable<int> someInt;
Variable<string> someString;
etc.

但是,即使你这样做,你仍然会把它作为一个对象装回第二个你把它放在一个DataTable中,所以这是一个徒劳的练习。