public static object GetCustomMember(CodeContext/*!*/ context, NamespaceTracker/*!*/ self, string name) { MemberTracker mt; if (self.TryGetValue(name, out mt)) { if (mt.MemberType == TrackerTypes.Namespace || mt.MemberType == TrackerTypes.TypeGroup) { return mt; } PythonTypeSlot pts = PythonTypeOps.GetSlot(new MemberGroup(mt), name, PythonContext.GetContext(context).Binder.PrivateBinding); object value; if (pts != null && pts.TryGetValue(context, null, TypeCache.PythonType, out value)) { return value; } } return OperationFailed.Value; }
/// <summary> /// Recursively lookup a member in a given namespace. /// </summary> /// <param name="name">A name for a type, possibly delimited by periods.</param> /// <param name="n">The namespace</param> /// <returns>The type as an object</returns> public object LookupMember(string name, NamespaceTracker n) { object varOutput; var periodIndex = name.IndexOf('.'); if (periodIndex == -1) { if (n.TryGetValue(name, out varOutput)) { return varOutput; } return null; } var currentName = name.Substring(0,periodIndex); var theRest = name.Substring(periodIndex+1); if (n.TryGetValue(currentName, out varOutput)) { if (varOutput is NamespaceTracker) { return LookupMember(theRest, varOutput as NamespaceTracker); } } return null; }