static bool IsBase (MethodReference method, MethodReference mr) { if (mr.Name != method.Name) return false; if (!mr.CompareSignature (method)) return false; foreach (TypeDefinition baseType in method.DeclaringType.AllSuperTypes ()) { if (mr.DeclaringType.FullName == baseType.FullName) return true; } return false; }
static bool IsBase (MethodReference method, MethodReference mr) { if (mr.Name != method.Name) return false; if (!mr.CompareSignature (method)) return false; TypeReference type = mr.DeclaringType; foreach (TypeDefinition baseType in method.DeclaringType.AllSuperTypes ()) { if (baseType.IsNamed (type.Namespace, type.Name)) return true; } return false; }
private static bool SignatureMatches(MethodReference method, MethodReference baseMethod, bool explicitInterfaceCheck) { string name = method.Name; string base_name = baseMethod.Name; if (name != base_name) { if (!explicitInterfaceCheck) return false; TypeReference btype = baseMethod.DeclaringType; string bnspace = btype.Namespace; if (!name.StartsWith (bnspace, StringComparison.Ordinal)) return false; if (name [bnspace.Length] != '.') return false; string bname = btype.Name; if (String.CompareOrdinal (bname, 0, name, bnspace.Length + 1, bname.Length) != 0) return false; int dot = bnspace.Length + bname.Length + 1; if (name [dot] != '.') return false; if (name.LastIndexOf (base_name, StringComparison.Ordinal) != dot + 1) return false; } return method.CompareSignature (baseMethod); }
private static bool CompareMethods (MethodReference method1, MethodReference method2, bool virtual_call) { if (method1 == null) return (method2 == null); if (method2 == null) return false; // shortcut, if it's not virtual then only compare metadata tokens if (!virtual_call) return (method1.MetadataToken == method2.MetadataToken); // we could be implementing an interface (skip position 0 because of .ctor and .cctor) string m1name = method1.Name; bool explicit_interface = (m1name.IndexOf ('.') > 0); if (!explicit_interface && (m1name != method2.Name)) return false; // compare parameters if (!method1.CompareSignature (method2)) return false; TypeReference t2 = method2.DeclaringType; TypeDefinition t2r = t2.Resolve (); if (!explicit_interface && (t2r != null) && !t2r.IsInterface) return true; string t2name = t2.FullName; // we're calling into an interface and this could be us! foreach (MethodReference mr in method1.Resolve ().Overrides) { if (t2name == mr.DeclaringType.FullName) return true; } return false; }