我使用绑定到附加到大型集合的iBindingListView实现(第三方dll)的DataGridView遇到了问题.
我的集合类型中有一个名为MyDateTime的属性,它是一个类似于DateTime的值类,但也包含一些遗留代码.
该结构实现了iComparable,iComparable< T>和iEquatable< T>.
我遇到的问题是:
当我对MyDateTimeColumn上的iBindingListView应用排序时,它总是使用非泛型iComparer,导致数十万次不必要的装箱和拆箱.
当我使用DGV提供的自动排序时,它会对列进行字符串排序.保持此列“自动”而不是仅用于此列的程序化是不可接受的.
当我删除非泛型iComparer时,仍然不使用泛型iComparer,它只是在.ToString()上进行字符串比较.
我错过了什么吗?为什么我的通用比较器没有被调用?
解决方法:
最终,这种类型的数据绑定通常是基于反射的,而反射是基于对象的;所以拳击是现实.实际上,你可以在实现IBindingListView时控制它,但这将是一项大量的工作,我猜他们根本没有(理智).
更简单的方法(我假设他们正在使用)是信任PropertyDescriptor,调用GetValue然后使用Comparer.Default.Compare(x,y).一旦你调用GetValue,没有任何一点没有使用你已经装箱的对象(然后必须取消装箱).
如果您不信任PropertyDescriptor,那么您将进入特定于实现的代码,它不支持世界的一般ComponentModel视图(因此它不适用于数据表或定制模型等).