예제 #1
0
        private static int GetDispIDForName(this IDispatchEx dispatchEx, string name, bool ensure, bool ignoreCase)
        {
            var flags = ignoreCase ? DispatchNameFlags.CaseInsensitive : DispatchNameFlags.CaseSensitive;

            if (ensure)
            {
                flags |= DispatchNameFlags.Ensure;
            }

            var result = dispatchEx.GetDispID(name, flags, out var dispid);

            if (ensure && (result == HResult.DISP_E_UNKNOWNNAME))
            {
                throw new NotSupportedException("The object does not support dynamic properties");
            }

            if (HResult.Succeeded(result))
            {
                return(dispid);
            }

            if (name.IsDispIDName(out dispid))
            {
                return(dispid);
            }

            var member = dispatchEx.GetMembers().FirstOrDefault(testMember => testMember.Name.Equals(name, ignoreCase ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal));

            if (member != null)
            {
                return(member.DispID);
            }

            throw new MissingMemberException(MiscHelpers.FormatInvariant("The object has no property named '{0}'", name));
        }
예제 #2
0
        public object GetProperty(string name, out bool isCacheable, params object[] args)
        {
            isCacheable = false;

            DispatchMember member = null;

            if (args.Length < 1)
            {
                // some objects crash on attempt to retrieve a method as a property

                member = dispatchEx.GetMembers().FirstOrDefault(testMember => testMember.Name == name);
                if ((member != null) && member.DispatchFlags == DispatchFlags.Method)
                {
                    return(new HostMethod(hostItem, name));
                }
            }

            try
            {
                var result = dispatchEx.GetProperty(name, false, args);
                return(result);
            }
            catch (Exception)
            {
                if (args.Length < 1)
                {
                    if (member == null)
                    {
                        member = dispatchEx.GetMembers().FirstOrDefault(testMember => testMember.Name == name);
                    }

                    if ((member != null) && !member.DispatchFlags.HasFlag(DispatchFlags.Method))
                    {
                        return(new HostIndexedProperty(hostItem, name));
                    }

                    return(new HostMethod(hostItem, name));
                }

                throw;
            }
        }
예제 #3
0
 public static IEnumerable <string> GetPropertyNames(this IDispatchEx dispatchEx)
 {
     return(dispatchEx.GetMembers().Select(member => member.Name));
 }