我正在尝试构建一个将任何IEnumerable转换为对象[,]的泛型方法。这样做的目的是通过ExcelDNA插入excel,理想情况下需要2d对象数组。
我不熟悉反思,需要一些认真的帮助来填补这里的空白。 下面发布的代码是我到目前为止所需要的,我需要的是在外部循环中获取DataSource的索引i处的T属性。在内部循环中,然后依次获取每个属性的值并插入对象[,]。
任何帮助表示赞赏。 谢谢 理查德
public object[,] ConvertListToObject<T>(IEnumerable<T> DataSource)
{
int rows = DataSource.Count();
//Get array of properties of the type T
PropertyInfo[] propertyInfos;
propertyInfos = typeof(T).GetProperties(BindingFlags.Public);
int cols = propertyInfos.Count(); //Cols for array is the number of public properties
//Create object array with rows/cols
object[,] excelarray = new object[rows, cols];
for (int i = 0; i < rows; i++) //Outer loop
{
for(int j = 0; j < cols; j++) //Inner loop
{
object[i,j] = //Need to insert each property val into j index
}
}
return excelarray;
}
}
答案 0 :(得分:5)
你非常接近。一些指示:
foreach
循环,因为您通常无法通过索引有效地访问IEnumerable
。GetProperties
需要BindingFlags.Static
或.Instance
才能返回任何内容。propertyInfos[j].GetValue
获取实际值,传入T
- 要获取它的实例和一组索引器值 - 对于常规属性为null,但如果您的对象可能有索引属性,您需要找出要传递的内容或处理可能会抛出的异常。我得到这样的东西:
public object[,] ConvertListToObject<T>(IEnumerable<T> DataSource)
{
int rows = DataSource.Count();
//Get array of properties of the type T
PropertyInfo[] propertyInfos;
propertyInfos = typeof(T).GetProperties(
BindingFlags.Public |
BindingFlags.Instance); // or .Static
int cols = propertyInfos.Length;
//Create object array with rows/cols
object[,] excelarray = new object[rows, cols];
int i = 0;
foreach (T data in DataSource) //Outer loop
{
for (int j = 0; j < cols; j++) //Inner loop
{
excelarray[i, j] = propertyInfos[j].GetValue(data, null);
}
i++;
}
return excelarray;
}
答案 1 :(得分:1)
由于您无法索引到可枚举项,因此您应该在递增计数器时在foreach循环中枚举它,而不是使用for循环。
int i = 0;
foreach (var row in DataSource)
{
for (int j = 0; j < cols; j++)
excelarray[i,j] = propertyInfos[j].GetValue(row, null);
i++;
}
答案 2 :(得分:1)
public object[,] ConvertListToObject<T>(IEnumerable<T> dataSource)
{
if (dataSource != null)
{
var rows = dataSource.Count();
var propertyInfos = typeof (T).GetProperties(BindingFlags.Public);
var cols = propertyInfos.Length;
var excelarray = new object[rows,cols];
var i = 0;
foreach (var data in dataSource)
{
for (var j = 0; j < cols; j++)
{
excelarray[i, j] = propertyInfos[j].GetValue(data, null);
}
i++;
}
return excelarray;
}
return new object[,] {};
}