// TODO: if it's an indexer then we want to override get_Item/set_Item methods // which map to [] and []= internal void AddBaseMethods(Type finishedType, SpecialNames specialNames) { // "Adds" base methods to super type - this makes super(...).xyz to work - otherwise // we'd return a function that did a virtual call resulting in a stack overflow. OverriddenMembers overrides = OverriddenMembers.GetForType(finishedType); foreach (MethodInfo mi in finishedType.GetMethods()) { if (!ShouldOverrideVirtual(mi)) { continue; } string methodName = mi.Name; if (methodName.StartsWith(BaseMethodPrefix) || methodName.StartsWith(FieldGetterPrefix) || methodName.StartsWith(FieldSetterPrefix)) { foreach (string newName in specialNames.GetBaseName(mi)) { if (mi.IsSpecialName && (newName.StartsWith("get_") || newName.StartsWith("set_"))) { StoreOverriddenProperty(overrides, mi, newName); } else if (mi.IsSpecialName && (newName.StartsWith(FieldGetterPrefix) || newName.StartsWith(FieldSetterPrefix))) { StoreOverriddenField(overrides, mi, newName); } else { StoreOverriddenMethod(overrides, mi, newName); } } } } }
private void StoreOverriddenMethod(OverriddenMembers overrides, MethodInfo mi, string newName) { MemberInfo[] members = _baseType.GetMember(newName, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy); Debug.Assert(members.Length > 0, String.Format("{0} from {1}", newName, _baseType.Name)); Type declType = members[0].DeclaringType; overrides.AddMethod(mi, newName); }
internal static OverriddenMembers GetForType(Type/*!*/ type) { OverriddenMembers result; lock (_overrideData) { if (!_overrideData.TryGetValue(type, out result)) { _overrideData[type] = result = new OverriddenMembers(); } } return result; }
internal static OverriddenMembers GetForType(Type /*!*/ type) { OverriddenMembers result; lock (_overrideData) { if (!_overrideData.TryGetValue(type, out result)) { _overrideData[type] = result = new OverriddenMembers(); } } return(result); }
private void StoreOverriddenField(OverriddenMembers overrides, MethodInfo mi, string newName) { string fieldName = newName.Substring(FieldGetterPrefix.Length); // get_ or set_ foreach (FieldInfo pi in _baseType.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy)) { if (pi.Name == fieldName) { if (newName.StartsWith(FieldGetterPrefix)) { overrides.AddMethod(mi, fieldName); } else if (newName.StartsWith(FieldSetterPrefix)) { overrides.AddMethod(mi, fieldName + "="); } } } }
private void StoreOverriddenProperty(OverriddenMembers overrides, MethodInfo mi, string newName) { string propName = newName.Substring(4); // get_ or set_ foreach (PropertyInfo pi in _baseType.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy)) { if (pi.Name == propName) { if (newName.StartsWith("get_")) { overrides.AddMethod(mi, propName); } else if (newName.StartsWith("set_")) { overrides.AddMethod(mi, propName + "="); } } } }
public static List <MemberTracker /*!*/> GetOverriddenMembersForType(Type /*!*/ type, string /*!*/ name) { return(OverriddenMembers.GetForType(type).GetMembers(name)); }