1

我正在使用 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;

如果我选择列表本身作为数据源,则 DisplayNames 用作列标题而不是结构成员名称:

在此处输入图像描述

使用 FastMember.ObjectReader 时如何重新创建它?

4

1 回答 1

1

哦,我明白你的意思了;您希望在元数据IDataReader中公开[DisplayName];但是,暴露的主要方式是 via 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这意味着除了手动填充, 也许使用 fast-member 来获取数据之外,我没有什么可以建议的。

于 2016-09-20T15:13:59.593 回答