获取Comparer <t> .Default在运行时不知道类型

时间:2017-07-11 08:45:02

标签: c# compare icomparer

我正在编写一个可以接受任何类型并进行比较的各种类型的比较器库。现在我创建了一个可以使用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)已经更好,更清晰,更不容易出错。

那么,有没有更合适的方法呢?

0 个答案:

没有答案