예제 #1
0
        public static IComparer <TSelf> Create <TSelf, TEpsilon>(TEpsilon epsilon)
        {
            if (typeof(TSelf) == typeof(double) && typeof(TEpsilon) == typeof(double))
            {
                return((IComparer <TSelf>) new DoubleComparer((double)(object)epsilon));
            }
            var epsilonSubMethod = typeof(TSelf).GetTypeInfo()
                                   .GetMethod("op_Subtraction", new [] { typeof(TSelf), typeof(TSelf) });

            if (epsilonSubMethod == null)
            {
                throw SpecFailure.BadEpsilonComparerTypes(typeof(TSelf));
            }
            var epsilonType = epsilonSubMethod.ReturnType;

            if (epsilonType == typeof(TSelf))
            {
                return(new ReflectedEpsilonComparer <TSelf>((TSelf)(object)epsilon));
            }

            var type = typeof(ReflectedEpsilonComparer <,>).MakeGenericType(typeof(TSelf), epsilonType);

            return((IComparer <TSelf>)Activator.CreateInstance(type, epsilon));
        }