- MethodInfo[] parent_methods = parent.GetMethods (bindingAttr);
- if (methods == null)
- candidates = parent_methods;
- else {
- candidates = new MethodInfo [methods.Length + parent_methods.Length];
- parent_methods.CopyTo (candidates, 0);
- methods.CopyTo (candidates, parent_methods.Length);
+ MethodInfo [] parent_methods = parent.GetMethods (bindingAttr);
+ ArrayList parent_candidates = new ArrayList (parent_methods.Length);
+
+ bool flatten = (bindingAttr & BindingFlags.FlattenHierarchy) != 0;
+
+ for (int i = 0; i < parent_methods.Length; i++) {
+ MethodInfo m = parent_methods [i];
+
+ mattrs = m.Attributes;
+
+ if (m.IsStatic && !flatten)
+ continue;
+
+ switch (mattrs & MethodAttributes.MemberAccessMask) {
+ case MethodAttributes.Public:
+ match = (bindingAttr & BindingFlags.Public) != 0;
+ break;
+ case MethodAttributes.Assembly:
+#if NET_2_0
+ match = (bindingAttr & BindingFlags.NonPublic) != 0;
+#else
+ match = false;
+#endif
+ break;
+ case MethodAttributes.Private:
+ match = false;
+ break;
+ default:
+ match = (bindingAttr & BindingFlags.NonPublic) != 0;
+ break;
+ }
+
+ if (match)
+ parent_candidates.Add (m);
+ }
+
+ if (methods == null) {
+ candidates = new MethodInfo [parent_candidates.Count];
+ parent_candidates.CopyTo (candidates);
+ } else {
+ candidates = new MethodInfo [methods.Length + parent_candidates.Count];
+ parent_candidates.CopyTo (candidates, 0);
+ methods.CopyTo (candidates, parent_candidates.Count);