// Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. using System; using System.Dynamic; using System.Linq; namespace Microsoft.ClearScript { ///

/// Extends for enhanced behavior and performance in a scripting environment. /// public abstract class DynamicHostObject : DynamicObject { // ReSharper disable EmptyConstructor /// /// Initializes a new instance. /// protected DynamicHostObject() { // the help file builder (SHFB) insists on an empty constructor here } // ReSharper restore EmptyConstructor /// /// Determines whether the object has the specified named member. /// /// The member name for which to search. /// True to perform a case-insensitive search, false otherwise. /// True if the named member was found, false otherwise. public virtual bool HasMember(string name, bool ignoreCase) { var comparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal; return GetDynamicMemberNames().Contains(name, comparer); } internal static bool HasMember(IDynamicMetaObjectProvider metaObjectProvider, DynamicMetaObject metaObject, string name, bool ignoreCase) { if (metaObjectProvider is DynamicHostObject hostObject) { return hostObject.HasMember(name, ignoreCase); } var comparer = ignoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal; return metaObject.GetDynamicMemberNames().Contains(name, comparer); } } }