我正在使用FastMember.ObjectReader将结构列表复制到DataTable,然后将其用作gridview的DataSource:
struct Foo {
[DisplayName("title1")]
public string Bar { get; set; }
}
...
var rows = new List<Foo>();
rows.Add(new Foo { Bar = "somethingsomething" });
DataTable table = new DataTable();
using (var reader = ObjectReader.Create(rows)) {
table.Load(reader);
}
grid.DataSource = table.DefaultView;
如果我选择列表本身作为DataSource,DisplayNames将用作列标题而不是结构成员名称:
如何在使用FastMember.ObjectReader时重新创建它?
答案 0 :(得分:1)
哦,我明白你的意思了;您希望IDataReader
在元数据中公开[DisplayName]
;但是,暴露的主要方式是GetSchemaTable()
,而AFAIK没有可识别的密钥来表示[DisplayName]
。将其作为名称IMO传递是不正确的。
运行快速测试:
var table = new DataTable();
table.Columns.Add("foo").Caption = "bar";
var schema = table.CreateDataReader().GetSchemaTable();
foreach(DataRow row in schema.Rows)
{
foreach(DataColumn col in schema.Columns)
{
Console.WriteLine($"{col.ColumnName}={row[col]}");
}
Console.WriteLine();
}
表明确实不太可能在那里期待它:
ColumnName=foo
ColumnOrdinal=0
ColumnSize=-1
NumericPrecision=
NumericScale=
DataType=System.String
ProviderType=
IsLong=False
AllowDBNull=True
IsReadOnly=False
IsRowVersion=False
IsUnique=False
IsKey=False
IsAutoIncrement=False
BaseCatalogName=
BaseSchemaName=
BaseTableName=
BaseColumnName=foo
AutoIncrementSeed=0
AutoIncrementStep=1
DefaultValue=
Expression=
ColumnMapping=1
BaseTableNamespace=
BaseColumnNamespace=
这意味着除了手动填充.Caption
之外,除了手动填充{{1}}之外,我真的没有其他建议,或许可以使用fast-member来获取数据。