我正在编写一个可以接受任何类型并进行比较的各种类型的比较器库。现在我创建了一个可以使用Comparer<T>.Default.Compare
的有序比较,因为它完全符合我的要求。如何在编译时不知道类型T
的情况下构建它?
像
这样的东西public static int CompareOrdered<T>(T lhs, T rhs) {
return Comparer<T>.Default.Compare(lhs, rhs);
}
将无效,因为T
通常属于object
类型,我希望为T
填写最准确的类型。
我现在所拥有的是以下假设lhs
具有正确的比较类型。
public static int CompareOrdered(object lhs, object rhs) {
var type = lhs.GetType();
var comparerType = typeof(Comparer<>).MakeGenericType(type);
var comparer = comparerType
.GetProperty("Default", BindingFlags.Public | BindingFlags.Static)
.GetValue(null);
var func = comparerType
.GetMethod("Compare", BindingFlags.Public | BindingFlags.Instance);
return (int)func.Invoke(comparer, new[] { lhs, rhs });
}
这非常难看。我搜索了一般Comparer
类型,其中不需要T
,但这不存在。这将允许((Comparer)comparer).Default.Compare(lhs,rhs)
已经更好,更清晰,更不容易出错。
那么,有没有更合适的方法呢?