1

FastMember.ObjectReader を使用して構造体のリストを DataTable にコピーし、それをグリッドビューの 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 を使用する場合、どのように再作成できますか?

4

1 に答える 1

1

ああ、あなたの言いたいことはわかります。をメタデータでIDataReader公開する必要があります。[DisplayName]ただし、公開される主な方法は経由GetSchemaTable()であり、私の知る限り、表現する認識されたキーはありません[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、データを取得するためにおそらく高速メンバーを使用して、.

于 2016-09-20T15:13:59.593 に答える