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)); }