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)); } }
private static void GetProperties(object jsonObject, out Dictionary <string, object> properties) { properties = new Dictionary <string, object>(); IDispatchEx dispatch = jsonObject as IDispatchEx; if (dispatch == null) { return; } int id = DISPID_START_ENUM; int nextId = -2; while (0 == dispatch.GetNextDispID(fdexEnumAll, id, out nextId)) { string name; id = nextId; int result = dispatch.GetMemberName(id, out name); Debug.Assert(result == 0, "Member name must be present"); object o = jsonObject.GetType().InvokeMember(name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, jsonObject, null); // now, the property name maybe the instance annotation, while the instance annotation starts with "@" if (name.StartsWith("@")) { name = name.Substring(1); // remove the @ sign } properties.Add(name, o); } }
public static IEnumerable <string> GetPropertyNames(this IDispatchEx dispatchEx) { int dispid; var result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, SpecialDispIDs.StartEnum, out dispid); while (result == RawCOMHelpers.HResult.S_OK) { string name; if (dispatchEx.GetMemberName(dispid, out name) == RawCOMHelpers.HResult.S_OK) { yield return(name); } result = dispatchEx.GetNextDispID(DispatchEnumFlags.All, dispid, out dispid); } }