Passing BindingFlags.FlattenHierarchy to one of the Type.GetXXX methods, such as Type.GetMembers, will not return inherited interface members when you are querying on an interface type itself.
For example, given the following interface types:
public interface A
{
void AMethod();
}
public interface B
{
void BMethod();
}
public interface AB : A, B
{
void ABMethod();
}
Running the following code, despite passing BindingFlags.FlattenHierarchy, will only return members that are directly declared on the AB interface:
[C#]
using System;
using System.Reflection;
namespace Samples
{
class Program
{
static void Main(string[] args)
{
foreach (MemberInfo member in typeof(AB).GetMembers(BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.Public))
{
Console.WriteLine(member.Name);
}
}
}
}
The above code outputs the following:
ABMethod
To get the inherited members, you need to query each implemented interface for its members.
The following examples shows a way to do this:
[C#]
using System;
using System.Reflection;
using System.Collections.Generic;
namespace Samples
{
class Program
{
static void Main(string[] args)
{
foreach (MemberInfo member in GetMembers(typeof(AB), BindingFlags.Public | BindingFlags.Instance))
{
Console.WriteLine(member.Name);
}
}
private static ICollection<MemberInfo> GetMembers(Type type, BindingFlags flags)
{
HashSet<MemberInfo> members = new HashSet<MemberInfo>();
GetMembersRecursively(type, flags, members);
return members;
}
private static void GetMembersRecursively(Type type, BindingFlags flags, HashSet<MemberInfo> members)
{
MemberInfo[] childMembers = type.GetMembers(flags);
members.UnionWith(childMembers);
foreach (Type interfaceType in type.GetInterfaces())
{
GetMembersRecursively(interfaceType, flags, members);
}
}
}
}
The above code outputs the following:
ABMethod
AMethod
BMethod