我在将多维对象数组 ( object[,]
) 简单转换为新数据类型 ( string[,]
) 以进行日志记录时遇到了麻烦。该格式是一个动态二维数组,有许多列和行,但不能很好地适应框架中提供的通用集合对象之一。我会在整个过程中将它作为一个强类型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。我正在研究一种通过类型反射添加一些异常以消除剩余问题的简单方法。
谢谢。