IronRuby.Builtins.RubyClass.EnumerateClrMembers C# (CSharp) Method

EnumerateClrMembers() protected method

protected EnumerateClrMembers ( Type type ) : IEnumerable
type System.Type
return IEnumerable
        protected override IEnumerable<string/*!*/>/*!*/ EnumerateClrMembers(Type/*!*/ type) {
            var basicBindingFlags = BindingFlags.DeclaredOnly | BindingFlags.Public | BindingFlags.NonPublic;

            // default indexer:
            string defaultIndexerName = null;
            if (!_isSingletonClass) {
                object[] attrs = type.GetCustomAttributes(typeof(DefaultMemberAttribute), false);
                if (attrs.Length == 1) {
                    defaultIndexerName = ((DefaultMemberAttribute)attrs[0]).MemberName;
                }
            }

            foreach (MethodInfo method in type.GetMethods(basicBindingFlags | BindingFlags.Static | BindingFlags.Instance)) {
                if (IsVisible(method.Attributes, method.DeclaringType, false)) {
                    if (method.IsSpecialName) {
                        var name = RubyUtils.MapOperator(method);
                        if (name != null) {
                            yield return name;
                        }

                        if (method.IsStatic == _isSingletonClass) {
                            if (method.Name.StartsWith("get_")) {
                                var propertyName = method.Name.Substring(4);
                                yield return propertyName;

                                if (propertyName == defaultIndexerName) {
                                    yield return "[]";
                                }
                            }

                            if (method.Name.StartsWith("set_")) {
                                var propertyName = method.Name.Substring(4);
                                yield return propertyName + "=";

                                if (propertyName == defaultIndexerName) {
                                    yield return "[]=";
                                }
                            }
                        }
                    } else if (method.IsStatic == _isSingletonClass) {
                        yield return method.Name;
                    }
                }
            }

            var bindingFlags = basicBindingFlags | (_isSingletonClass ? BindingFlags.Static : BindingFlags.Instance);

            foreach (FieldInfo field in type.GetFields(bindingFlags)) {
                if (IsVisible(field)) {
                    yield return field.Name;

                    if (IsWriteable(field)) {
                        yield return field.Name + "=";
                    }
                }
            }

            foreach (EventInfo evnt in type.GetEvents(bindingFlags)) {
                yield return evnt.Name;
            }

        }