예제 #1
0
        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));
            }
        }
예제 #2
0
        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);
            }
        }