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