0

DOUBLEオブジェクトの配列があり、それを、NULLSTRINGまたはのみを受け入れるメソッドに渡したいと考えていますDATETIME。そのため、値を渡そうとすると、任意のオブジェクトを渡すことはできず、DOUBLENULLSTRINGまたはDATETIME最初に解析する必要があるというエラーが表示されます。

foreach (var currRow in dataSet.Tables[0].Rows)
{
    var tuple = Com.Tibco.As.Space.Tuple.Create();

    //here is where i loop through the object array
    for (int i = 0; i < currRow.Values.Length; i++)
    {
        //here is where i try to pass it to the method (which doesn't accept it)
        tuple.Put(dataSet.Tables[0].ColumnNames[i], currRow.Values[i]);
    }

    inSpace_.Put(tuple);
}

オブジェクトの配列は次のようになります

要するに、各オブジェクトを解析して適切なオブジェクトとしてキャストし、タプル内に配置する方法が必要です。

編集

これが私がやろうとしたことですが、うまくいきませんでした:

foreach (var currRow in dataSet.Tables[0].Rows)
{
    var tuple = Com.Tibco.As.Space.Tuple.Create();

    for (int i = 0; i < currRow.Values.Length; i++)
    {
        if (currRow.Values[i] != null)
        {
            if (dataSet.Tables[0].ColumnNames[i].GetType().IsEquivalentTo(typeof(DateTime)))
            {
                DateTime value = DateTime.Parse(dataSet.Tables[0].ColumnNames[i].ToString());
                tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
            }
            else if (dataSet.Tables[0].ColumnNames[i].GetType().IsEquivalentTo(typeof(Double)))
            {
                Double value = Convert.ToDouble(dataSet.Tables[0].ColumnNames[i]);
                tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
            }
            else
            {
                string value = dataSet.Tables[0].ColumnNames[i].ToString();
                tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
            }
        }
    }
    inSpace_.Put(tuple);
}
4

2 に答える 2

1
foreach (var currRow in dataSet.Tables[0].Rows)
{
    var tuple = Com.Tibco.As.Space.Tuple.Create();

    for (int i = 0; i < currRow.Values.Length; i++)
    {
        var obj = dataSet.Tables[0].ColumnNames[i], currRow.Values[i];
        var value = null;
        value = obj as double;
        if (!validObject(value)) value as string;
        if (!validObject(value)) value as DateTime;
        tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
    }

    inSpace_.Put(tuple);
}

bool validObject(object obj) { return (null != obj); }

更新、編集に基づいて、代わりにスイッチオンタイプを使用します:

for (int i = 0; i < currRow.Values.Length; i++)
{
    var type = obj.GetType();
    var obj = dataSet.Tables[0].ColumnNames[i], currRow.Values[i];
    var value = null;
    switch (type)
    {
        case DateTime:
            value = DateTime.Parse(obj);
            break;
        case double:
            value = Convert.ToDouble(obj);
            break;
        case string:
            value = Convert.ToString(obj);
            break;
    }
    tuple.Put(dataSet.Tables[0].ColumnNames[i], value);
}
于 2013-03-07T19:07:08.033 に答える
0

コンパイル時に型がわかっている場合はConvert.ToDoubleConvert.ToInt32、 などを使用します。わからない場合は、 を使用しますConvert.ChangeType

于 2013-03-07T19:07:06.210 に答える