static IEnumerable<Type> GetMemberTypes(MemberInfo memberInfo)
{
Type type = null;
switch (memberInfo.MemberType) {
case MemberTypes.Event:
type = ((EventInfo)memberInfo).EventHandlerType;
break;
case MemberTypes.Field:
type = ((FieldInfo)memberInfo).FieldType;
break;
case MemberTypes.Method:
type = ((MethodInfo)memberInfo).ReturnType;
break;
case MemberTypes.Property:
type = ((PropertyInfo)memberInfo).PropertyType;
break;
case MemberTypes.NestedType:
// Special case for nested type, we will iterate the nested members here
var members = ((Type)memberInfo).GetMembers();
var ntypes = new List<Type>();
foreach (var m in members) {
var mtypes = GetMemberTypes(m).Where(x => !ntypes.Contains(x));
ntypes.AddRange(mtypes);
}
return ntypes.ToArray();
}
return new[] { type };
}