private static bool IsUpForLifting(MethodInfo op) { foreach (var pi in op.GetParameters().Concat(op.ReturnParameter.AsArray())) { var ptype = pi.ParameterType; if (!ptype.IsGenericParameter) { if (!ptype.IsNonNullableValueType()) return false; } else { // here we need to check only generic parameter attributes // since one can't inherit from value types Func<GenericParameterAttributes, bool> isNnvt = gpa => (gpa & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0; if (isNnvt(ptype.GenericParameterAttributes)) { continue; } Func<ICustomAttributeProvider, IEnumerable<SignatureValidWhenAttribute>> swats = cap => cap.Attrs<SignatureValidWhenAttribute>(); var unrelatedSwats = swats(op).Concat( swats(op.ReturnTypeCustomAttributes).Concat( op.GetParameters().Select(fpi => swats(fpi.ParameterType)).Flatten().Concat( op.XGetGenericArguments().Where(gpi => gpi != ptype).Select(gpi => swats(gpi)).Flatten()))); if (unrelatedSwats.Any(swat => isNnvt(swat.InferGenericParameterAttributes(ptype)))) { continue; } if (swats(ptype).Any(swat => isNnvt(swat.InferTargetGenericParameterAttributes()))) { continue; } return false; } } if (op.GetOperatorTypes().Any(opType => opType.IsRelational())) { if (op.ReturnType != typeof(bool)) return false; } return true; }
public static bool IsHiddenBy(this MethodInfo m1, MethodInfo m2) { if (m1.IsExtension() || m2.IsExtension()) return false; if (m1.IsOperator() || m2.IsOperator()) return false; m1 = m1.XGetGenericDefinition(); m2 = m2.XGetGenericDefinition(); if (!m2.DeclaringType.LookupThisAndBaseTypes().Contains(m1.DeclaringType)) return false; var aux = Guid.NewGuid().ToString(); var namesMatch = (m1.IsIndexer() ? aux : m1.Name) == (m2.IsIndexer() ? aux : m2.Name); var typeParamsMatch = m1.XGetGenericArguments().Length == m2.XGetGenericArguments().Length; var paramListStyleMatch = m1.IsVarargs() == m2.IsVarargs(); var formalParamsMatch = m1.GetParameters().AllMatch(m2.GetParameters(), (p1, p2) => { if (p1.IsOut ^ p2.IsOut) return false; if (p1.ParameterType.IsByRef ^ p2.ParameterType.IsByRef) return false; var p1m = p1.ParameterType.GetStructuralTree(); var p2m = p2.ParameterType.GetStructuralTree(); return p1m.AllMatch(p2m, (p1mi, p2mi) => { if (p1mi.Key != p2mi.Key) return false; if (p1mi.Value.IsGenericParameter ^ p2mi.Value.IsGenericParameter) return false; if (!p1mi.Value.IsGenericParameter && !p2mi.Value.IsGenericParameter) { return p1mi.Value.SameBasisType(p2mi.Value); } else { Func<MethodInfo, KeyValuePair<String, Type>, bool> isMethodParam = (mi, pimi) => mi.XGetGenericArguments().Contains(pimi.Value); var positionsMatch = p1mi.Value.GenericParameterPosition == p2mi.Value.GenericParameterPosition; return isMethodParam(m1, p1mi) && isMethodParam(m2, p2mi) && positionsMatch; } }); }); var sigsMatch = namesMatch && typeParamsMatch && paramListStyleMatch && formalParamsMatch; return m1.IsHideBySig ? sigsMatch : namesMatch; }