2

私は辞書を多用して、いくつかの(高度に結合された)コードを分離しています。これが私の質問に関連するものです:

//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()}
};

ここで、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にする必要があるかどうかもわかりません(これを機能させることができると仮定します)。

アドバイスをいただければ幸いです。

よろしく。

4

1 に答える 1

1

このコードには最終的な結果はありません。DataTableはデータをオブジェクトとして格納し(そのため、データを取得するときにキャストする必要があります)、Variable()クラスはオブジェクトを保持するため、実際にキャストしても有用な作業は行われません。

基本的に、キャストが機能するように作成された場合でも、同じ行でデータをボックス化解除してすぐに再ボックス化することになります。

これを回避するために実行時に型を保持したい場合(これはあなたがやろうとしているように見えることです)、変数クラスを次のような汎用クラスにする必要があります。

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

次に、次のような特定のタイプの変数をインスタンス化します。

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

ただし、これを行ったとしても、DataTableに配置した瞬間にオブジェクトとしてボックスバックされるため、無駄な作業になります。

于 2012-08-18T02:04:05.747 に答える