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)); }
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; } }
public static IEnumerable <string> GetPropertyNames(this IDispatchEx dispatchEx) { return(dispatchEx.GetMembers().Select(member => member.Name)); }