コード例 #1
0
ファイル: ActionBinder.cs プロジェクト: stantoxt/dlr
        /// <summary>
        /// Gets the members that are visible from the provided type of the specified name.
        ///
        /// The default implemetnation first searches the type, then the flattened heirachy of the type, and then
        /// registered extension methods.
        /// </summary>
        public virtual MemberGroup GetMember(MemberRequestKind action, Type type, string name)
        {
            IEnumerable <MemberInfo> foundMembers = type.GetInheritedMembers(name);

            if (!PrivateBinding)
            {
                foundMembers = CompilerHelpers.FilterNonVisibleMembers(type, foundMembers);
            }

            MemberGroup members = new MemberGroup(foundMembers.ToArray());

            // check for generic types w/ arity...
            string          genName  = name + ReflectionUtils.GenericArityDelimiter;
            List <TypeInfo> genTypes = null;

            foreach (TypeInfo t in type.GetDeclaredNestedTypes())
            {
                if (t.IsPublic && t.Name.StartsWith(genName))
                {
                    if (genTypes == null)
                    {
                        genTypes = new List <TypeInfo>();
                    }

                    genTypes.Add(t);
                }
            }

            if (genTypes != null)
            {
                List <MemberTracker> mt = new List <MemberTracker>(members);
                foreach (TypeInfo t in genTypes)
                {
                    mt.Add(MemberTracker.FromMemberInfo(t));
                }
                return(MemberGroup.CreateInternal(mt.ToArray()));
            }

            if (members.Count == 0)
            {
                members = new MemberGroup(
                    type.GetInheritedMembers(name, flattenHierarchy: true).WithBindingFlags(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance).ToArray()
                    );

                if (members.Count == 0)
                {
                    members = GetAllExtensionMembers(type, name);
                }
            }

            return(members);
        }
コード例 #2
0
        private MemberGroup GetMember(Type type, string name)
        {
            var foundMembers = type.GetMember(name);

            if (!PrivateBinding)
            {
                foundMembers = CompilerHelpers.FilterNonVisibleMembers(type, foundMembers);
            }

            var members = new MemberGroup(foundMembers);

            // check for generic types w/ arity...
            var         types    = type.GetNestedTypes(BindingFlags.Public);
            var         genName  = name + ReflectionUtils.GenericArityDelimiter;
            List <Type> genTypes = null;

            foreach (var t in types)
            {
                if (t.Name.StartsWith(genName))
                {
                    if (genTypes == null)
                    {
                        genTypes = new List <Type>();
                    }
                    genTypes.Add(t);
                }
            }

            if (genTypes != null)
            {
                var mt = new List <MemberTracker>(members);
                mt.AddRange(genTypes.Select(MemberTracker.FromMemberInfo));
                return(new MemberGroup(mt.ToArray()));
            }

            if (members.Count == 0)
            {
                members =
                    new MemberGroup(
                        type.GetMember(
                            name,
                            BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static |
                            BindingFlags.Instance));
                if (members.Count == 0)
                {
                    //members = GetAllExtensionMembers(type, name);
                }
            }

            return(members);
        }
コード例 #3
0
ファイル: ActionBinder.cs プロジェクト: gaybro8777/ironruby
        /// <summary>
        /// Gets the members that are visible from the provided type of the specified name.
        ///
        /// The default implemetnation first searches the type, then the flattened heirachy of the type, and then
        /// registered extension methods.
        /// </summary>
        public virtual MemberGroup GetMember(OldDynamicAction action, Type type, string name)
        {
            MemberInfo[] foundMembers = type.GetMember(name);
            if (!PrivateBinding)
            {
                foundMembers = CompilerHelpers.FilterNonVisibleMembers(type, foundMembers);
            }

            MemberGroup members = new MemberGroup(foundMembers);

            // check for generic types w/ arity...
            Type[]      types    = type.GetNestedTypes(BindingFlags.Public);
            string      genName  = name + ReflectionUtils.GenericArityDelimiter;
            List <Type> genTypes = null;

            foreach (Type t in types)
            {
                if (t.Name.StartsWith(genName))
                {
                    if (genTypes == null)
                    {
                        genTypes = new List <Type>();
                    }
                    genTypes.Add(t);
                }
            }

            if (genTypes != null)
            {
                List <MemberTracker> mt = new List <MemberTracker>(members);
                foreach (Type t in genTypes)
                {
                    mt.Add(MemberTracker.FromMemberInfo(t));
                }
                return(MemberGroup.CreateInternal(mt.ToArray()));
            }

            if (members.Count == 0)
            {
                members = new MemberGroup(type.GetMember(name, BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance));
                if (members.Count == 0)
                {
                    members = GetAllExtensionMembers(type, name);
                }
            }

            return(members);
        }