+ null, ds, out warn, cref, false, null).Member as Type;
+ }
+
+ private static MemberInfo [] empty_member_infos =
+ new MemberInfo [0];
+
+ private static MemberInfo [] FindMethodBase (Type type,
+ BindingFlags binding_flags, MethodSignature signature)
+ {
+ MemberList ml = TypeManager.FindMembers (
+ type,
+ MemberTypes.Constructor | MemberTypes.Method | MemberTypes.Property | MemberTypes.Custom,
+ binding_flags,
+ MethodSignature.method_signature_filter,
+ signature);
+ if (ml == null)
+ return empty_member_infos;
+
+ return FilterOverridenMembersOut ((MemberInfo []) ml);
+ }
+
+ static bool IsOverride (PropertyInfo deriv_prop, PropertyInfo base_prop)
+ {
+ if (!MethodGroupExpr.IsAncestralType (base_prop.DeclaringType, deriv_prop.DeclaringType))
+ return false;
+
+ Type [] deriv_pd = TypeManager.GetArgumentTypes (deriv_prop);
+ Type [] base_pd = TypeManager.GetArgumentTypes (base_prop);
+
+ if (deriv_pd.Length != base_pd.Length)
+ return false;
+
+ for (int j = 0; j < deriv_pd.Length; ++j) {
+ if (deriv_pd [j] != base_pd [j])
+ return false;
+ Type ct = TypeManager.TypeToCoreType (deriv_pd [j]);
+ Type bt = TypeManager.TypeToCoreType (base_pd [j]);
+
+ if (ct != bt)
+ return false;
+ }
+
+ return true;
+ }
+
+ private static MemberInfo [] FilterOverridenMembersOut (
+ MemberInfo [] ml)
+ {
+ if (ml == null)
+ return empty_member_infos;
+
+ ArrayList al = new ArrayList (ml.Length);
+ for (int i = 0; i < ml.Length; i++) {
+ MethodBase mx = ml [i] as MethodBase;
+ PropertyInfo px = ml [i] as PropertyInfo;
+ if (mx != null || px != null) {
+ bool overriden = false;
+ for (int j = 0; j < ml.Length; j++) {
+ if (j == i)
+ continue;
+ MethodBase my = ml [j] as MethodBase;
+ if (mx != null && my != null &&
+ MethodGroupExpr.IsOverride (my, mx)) {
+ overriden = true;
+ break;
+ }
+ else if (mx != null)
+ continue;
+ PropertyInfo py = ml [j] as PropertyInfo;
+ if (px != null && py != null &&
+ IsOverride (py, px)) {
+ overriden = true;
+ break;
+ }
+ }
+ if (overriden)
+ continue;
+ }
+ al.Add (ml [i]);
+ }
+ return al.ToArray (typeof (MemberInfo)) as MemberInfo [];
+ }
+
+ struct FoundMember
+ {
+ public static FoundMember Empty = new FoundMember (true);
+
+ public bool IsEmpty;
+ public readonly MemberInfo Member;
+ public readonly Type Type;
+
+ public FoundMember (bool regardless_of_this_value_its_empty)
+ {
+ IsEmpty = true;
+ Member = null;
+ Type = null;
+ }
+
+ public FoundMember (Type found_type, MemberInfo member)
+ {
+ IsEmpty = false;
+ Type = found_type;
+ Member = member;
+ }