private static IEnumerable <DispatchMember> GetMembersRaw(this IDispatchEx dispatchEx) { var isEnumerable = false; int dispid; var result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, SpecialDispIDs.StartEnum, out dispid); while (result == HResult.S_OK) { string name; if (HResult.Succeeded(dispatchEx.GetMemberName(dispid, out name))) { DispatchPropFlags flags; if (HResult.Succeeded(dispatchEx.GetMemberProperties(dispid, DispatchPropFlags.CanAll, out flags))) { if (dispid == SpecialDispIDs.NewEnum) { isEnumerable = true; } yield return(new DispatchMember(name, dispid, flags)); } } result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, dispid, out dispid); } if (isEnumerable) { yield return(new DispatchMember("GetEnumerator", SpecialDispIDs.GetEnumerator, DispatchPropFlags.CanCall)); } }