0

DatagridViewこれで、オブジェクトのリストへのバインドができました。これで問題ありません。私がやっていることは、一度に 10 ほどの結果を一覧表示することです。結果は、ソースから結果を取り出して表示するだけの [次へ] ボタンと [前へ] ボタンでナビゲートできます。

問題は、Datagrid ビューでクリックされた列によってソースを並べ替えたいということです。その時点で表示されている結果だけでなく、すべての結果です。

やっと近づき始めました。ソースを比較し、データ値の呼び出しに使用されている列の名前で順序を設定することもできます。私が知る必要があるのは、データ型を自動的に設定できるかということです:

AppSettings.Instance.SearchResults.Sort(
    new Comparison<SearchResult>(
        (x, y) =>
        ((Int32) x.GetType().GetProperty("Links").GetValue(x, null)).CompareTo(
            ((Int32) y.GetType().GetProperty("Links").GetValue(y, null)))));

ここでは、プロパティを Int である Links に設定しています。CompareToであることを知っていても、値を変換せずに使用することはできませんInt32。私が比較するいくつかの値は型にDateTimeなるので、今は非常に近いので、データ型を動的に比較して取得できるかどうかを知る必要があります。

まとめ - 動的に呼び出されるプロパティ値のデータ型を自動的に識別したいと考えています。

4

1 に答える 1

1

あなたがやりたいことをするために、それが最善の「前進」であるかどうかはわかりません。

該当する場合は、IComparable<T>代わりに 使用します。

int BetterComparison<T>(T x, T y) where T : IComparable<T>
{
    return x.CompareTo(y);
}

そして、次のように呼び出します。

BetterComparison(10, 20);
BetterComparison(DateTime.Now, DateTime.Now.AddDays(1));

それでも何らかの理由でリフレクションに頼りたい場合(または、本質的により一般的なものを持っている場合、またはそのようなインターフェイスで定義されていない場合)...

reflect特定のタイプのメソッドを使用する必要がありますCompareTo-そして、持っている値で呼び出すだけです。たとえば、次のようなもの(メソッド内):

// x.GetType() and y.GetType() should be interchangable by the nature of it
var compareMethod = x.GetType().GetMethod("CompareTo", new[] { y.GetType() });
return (int)compareMethod.Invoke(x, new object[]{y});

これにより、次のように呼び出すことができます。

var ret1 = Comparison(10, 20);
var ret2 = Comparison(DateTime.Now, DateTime.Now.AddDays(1));
于 2013-04-20T14:03:48.487 に答える