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)))));

在这里,我将属性设置为 Links,它是一个 Int。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));

如果您出于某种原因仍然想求助于反射(或者本质上更通用的东西 - 或者没有由任何类似的接口定义)......

您应该使用特定类型reflectCompareTo方法 - 然后只需使用您拥有的值进行调用。例如这样的事情(在你的方法内):

// 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 回答