在这里,我有一个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
类型,所以我需要知道它是否可以比较并动态获取数据类型,因为我现在离我很近。
摘要 - 我想自动识别动态调用的属性值的数据类型。
答案 0 :(得分: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));