/// <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); }
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); }
/// <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); }