Propertyinfo反射返回Int32不是我需要的实际属性名称



我有以下代码,我试图获得属性名称供以后使用。然而,每当我运行这个,它输出属性类型为Int32与其附带的名称,我可以在visual studio中看到这一点,反射类型是正确的。如果它有助于对象修复,我传入的是一个数组。我在其他地方使用过这段代码,它没有数组也能正常工作,所以也许这就是问题所在。

我传入一个对象而不是确切类型的原因是我多次重用该方法,重载不是一个选项:

public void ExportResults(object fix, string fileName)
{
if (string.IsNullOrWhiteSpace(FileExport))
{
MessageBox.Show("File export cannot be empty", "Error", MessageBoxButton.OK);
}
else if (!string.IsNullOrWhiteSpace(FileExport))
{
StringBuilder sb = new StringBuilder();
using (var wbook = new XLWorkbook())
{
var rec = (object[])fix;
int col = 1;
var ws = wbook.Worksheets.Add("Sheet1");
foreach (var propertyInfo in from propertyInfo in fix.GetType().GetProperties()
where !propertyInfo.Name.Contains("ExtensionData")
select propertyInfo)
{
int row = 1;
ws.Cell(row++, col).Value = propertyInfo.Name;
for (int i = 0; i < rec.Length; i++)
{
ws.Cell(row++, col).Value = propertyInfo.GetValue(rec[i]);
}
col++;
}
for (int i = 0; i < rec.Length; i++)
{
foreach (var propertyInfo in from propertyInfo in fix.GetType().GetProperties()
where !propertyInfo.Name.Contains("ExtensionData")
select propertyInfo)
{
sb.AppendLine($"{propertyInfo.Name}: {propertyInfo.GetValue(rec[i])}");
}
sb.AppendLine();
}
}

编辑:

所以我解决了我的问题与以下。但我有很多评论,这不是很好的性能,我应该缓存属性,这是如何实现的?

public void ExportResults(object fix, string fileName)
{
if (string.IsNullOrWhiteSpace(FileExport))
{
MessageBox.Show("File export cannot be empty", "Error", MessageBoxButton.OK);
}
else if (!string.IsNullOrWhiteSpace(FileExport))
{
StringBuilder sb = new StringBuilder();
using (var wbook = new XLWorkbook())
{
var rec = (object[])fix;
int col = 1;
var prop = 0;
var ws = wbook.Worksheets.Add("Sheet1");
foreach (var propertyInfo in from propertyInfo in rec[prop].GetType().GetProperties()
where !propertyInfo.Name.Contains("ExtensionData")
select propertyInfo)
{
int row = 1;
ws.Cell(row++, col).Value = propertyInfo.Name;
for (int i = 0; i < rec.Length; i++)
{
ws.Cell(row++, col).Value = propertyInfo.GetValue(rec[i]);
}
col++;
prop++;
}

for (int i = 0; i < rec.Length; i++)
{
foreach (var propertyInfo in from propertyInfo in rec[i].GetType().GetProperties()
where !propertyInfo.Name.Contains("ExtensionData")
select propertyInfo)
{
sb.AppendLine($"{propertyInfo.Name}: {propertyInfo.GetValue(rec[i])}");
}
sb.AppendLine();
}
}

ClosedXML已经允许您使用InsertTable或InsertData从任何IEnumerable<T>插入数据到工作表中。InsertTable返回一个允许格式化、显示过滤器和总数等的表

var wb = new XLWorkbook();
var ws = wb.Worksheets.Add("Test Sheet");
var list = new List<Person>();
list.Add(new Person() { Name = "John", Age = 30, House = "On Elm St."   });
list.Add(new Person() { Name = "Mary", Age = 15, House = "On Main St."  });
list.Add(new Person() { Name = "Luis", Age = 21, House = "On 23rd St."  });
list.Add(new Person() { Name = "Henry", Age = 45, House = "On 5th Ave." });
var tableWithPeople = ws.Cell(1, 1).InsertTable(list);
tableWithPeople .Theme = XLTableTheme.TableStyleLight10;
ws.Columns().AdjustToContents();
wb.SaveAs("InsertingTables.xlsx");

将项目列表保存到工作表的方法可以短如:

public void SaveExcel<T>(IEnumerable<T> items,string path,string sheet="Sheet1")
{
var wb = new XLWorkbook();
var ws = wb.Worksheets.Add(sheet);
var table= ws.Cell(1, 1).InsertTable(items);
table.Theme = XLTableTheme.TableStyleLight10;
ws.Columns().AdjustToContents();
wb.SaveAs(path);
}

最新更新