/* **************************************************************************** * * Copyright (c) Microsoft Corporation. * * This source code is subject to terms and conditions of the Microsoft Public License. A * copy of the license can be found in the License.html file at the root of this distribution. If * you cannot locate the Microsoft Public License, please send an email to * dlr@microsoft.com. By using this source code in any fashion, you are agreeing to be bound * by the terms of the Microsoft Public License. * * You must not remove this notice, or any other, from this software. * * * ***************************************************************************/ using System.Collections.Generic; using System.Reflection; using Microsoft.Scripting.Utils; using Microsoft.Contracts; namespace Microsoft.Scripting.Actions { /// /// MemberGroups are a collection of MemberTrackers which are commonly produced /// on-demand to talk about the available members. They can consist of a mix of /// different member types or multiple membes of the same type. /// /// The most common source of MemberGroups is from ActionBinder.GetMember. From here /// the DLR will perform binding to the MemberTrackers frequently producing the value /// resulted from the user. If the result of the action produces a member it's self /// the ActionBinder can provide the value exposed to the user via ReturnMemberTracker. /// /// ActionBinder provides default functionality for both getting members from a type /// as well as exposing the members to the user. Getting members from the type maps /// closely to reflection and exposing them to the user exposes the MemberTrackers /// directly. /// public class MemberGroup : IEnumerable { [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Security", "CA2104:DoNotDeclareReadOnlyMutableReferenceTypes")] public static readonly MemberGroup EmptyGroup = new MemberGroup(MemberTracker.EmptyTrackers); private readonly MemberTracker[] _members; [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "noChecks")] private MemberGroup(MemberTracker[] members, bool noChecks) { Assert.NotNullItems(members); _members = members; } public MemberGroup(params MemberTracker[] members) { ContractUtils.RequiresNotNullItems(members, "members"); _members = members; } public MemberGroup(params MemberInfo[] members) { ContractUtils.RequiresNotNullItems(members, "members"); MemberTracker[] trackers = new MemberTracker[members.Length]; for (int i = 0; i < trackers.Length; i++) { trackers[i] = MemberTracker.FromMemberInfo(members[i]); } _members = trackers; } internal static MemberGroup CreateInternal(MemberTracker[] members) { Assert.NotNullItems(members); return new MemberGroup(members, true); } public int Count { get { return _members.Length; } } public MemberTracker this[int index] { get { return _members[index]; } } #region IEnumerable Members [Pure] public IEnumerator GetEnumerator() { foreach (MemberTracker tracker in _members) yield return tracker; } #endregion #region IEnumerable Members [Pure] System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { foreach (MemberTracker tracker in _members) yield return tracker; } #endregion } }