object[,]
多次元オブジェクト配列 ( ) から新しいデータ型 ( string[,]
) へのロギング目的での単純なキャストに問題があります。この形式は、多くの列と行を持つ動的な 2 次元配列ですが、フレームワークで提供される汎用コレクション オブジェクトの 1 つにはうまく適合しません。プロセス全体を通して厳密に型指定するだけですstring[,]
が、場合によっては異なるデータ型を使用する必要があるため、オブジェクト配列の柔軟性が必要です。
private List<KeyValuePair<string, object>> _dataList = new List<KeyValuePair<string, object>>();
private object[,] _dataArray;
public List<KeyValuePair<string, object>> RetrieveHistoricalData()
{
...
//Calling Method (for explaination and context purposes)
_log.Log ("\r\nRetrieveHistoricalData", "_dataList.Count: " + _dataList.Count);
_dataList.ForEach(dli => _log.Log ("\r\nRetrieveHistoricalData", "_dataList: "
+ dli.Key + ((object[,])dli.Value)
.CastTwoDimensionalArray<string>()
.TwoDimensionalArrayToString()));
...
}
... Jon Skeet の提案に基づいて拡張メソッドを追加しました ...
internal static T[,] CastTwoDimensionalArray<T>(this object[,] dataArray)
{
int rows = dataArray.GetLength(0);
int columns = dataArray.GetLength(1);
T[,] returnDataArray = new T[rows, columns];
for (int row = 0; row < rows; row++)
{
for (int column = 0; column < columns; column++)
{
returnDataArray[row, column] =
(T)Convert.ChangeType(dataArray[row, column], typeof(T));
}
}
return returnDataArray;
}
...ここに私自身の追加があります(実行中の行にあるためのみ含まれています)...
internal static string TwoDimensionalArrayToString<T>(this T[,] dataArray)
{
int rows = dataArray.GetLength(0);
int columns = dataArray.GetLength(1);
string returnString = "";
for (int row = 0; row < rows; row++)
{
for (int column = 0; column < columns; column++)
{
returnString = returnString + "[" + row + "," + column + "] =>" + dataArray[row,column]+ " ; ";
}
}
return returnString;
}
上記のコードを最初の投稿から編集しましたが、ジェネリック拡張メソッドで System.Double を System.String に変換しようとすると、まだ System.InvalidCastException を受け取ります。残りの問題を取り除くために、型リフレクションを通じていくつかの例外を追加する簡単な方法に取り組んでいます。
ありがとう。