2

Winforms Datagrid への Fluent Interface を作成しようとしています。これにより、型指定されたデータソースを使用し、プロパティ (Order.Custom.FullName) のプロパティを簡単に使用できるようになります。

初期化時に列を追加し、そこで使用するプロパティを設定しようとしています:

dgv.With<Order>().Column("Client Name").On(x => x.Client.FullName);

元の質問は、データソースを設定するときに発生します。

dgv.SetTypedDatasource<T>(IList<Order> orders)

ここでの大きな問題は、ジェネリックコントロールが不可能であるため(推測)、クラスに T を指定することはできず、メソッドごとに指定する必要があることです...

ラムダ式の特定のプロパティに基づいて、匿名型のリストを作成したいと考えています。

何かのようなもの:

ProcessList<Client>(clientList, x => x.FullName);

次のようなことは可能ですか?

[編集] 実際には、式は以前に設定され、別の場所にフェッチされることに注意してください...

public void ProcessList<T>(IList<T> sourceList, Expression<Func<T, object>> expression)
{
    var list =
        (from T x
         in sourceList
         select new { expression })
         .ToList();

    // process list ....  grid.DataSource = list;
}

したがって、指定された式に基づいて匿名型を作成したいと思います。その式を評価して正しいプロパティを取得できることはわかっています。

私はちょっと立ち往生しています、このようなことは可能ですか?

何か案は?

4

2 に答える 2

4

さて、Selectあなたへの簡単な呼び出しで、非常に近づくことができます:

ProcessList(clientList.Select(x => new { x.FullName }));

...

public void ProcessList<T>(IEnumerable<T> list)
{
    // process list ... T will be an anonymous type by now
    grid.DataSource = list;
}

(これは、元のリストも必要ないことを前提としていますProcessList。必要な場合は、選択をそこに移動します。)

于 2009-04-16T20:30:15.160 に答える
2

それだけじゃない?grid.DataSource = sourceList.AsQueryable().Select(expression).ToList();

リストが型付けされるように、2 番目のジェネリックを導入する方がよいことに注意してください。

    public static void ProcessList<TSource, TValue>(
        IList<TSource> sourceList,
        Func<TSource, TValue> expression)
    {
        grid.DataSource = sourceList.Select(expression).ToList();
    }

目的を果たさないように見えたので、Expression<...>から justに切り替えたことに注意してください。Func<...>

于 2009-04-16T20:31:41.163 に答える