private static MemberGroup/*!*/ DirResolver(MemberBinder/*!*/ binder, Type/*!*/ type) { return binder.GetMember(type, "GetMemberNames"); }
public override MemberGroup/*!*/ ResolveMember(MemberBinder/*!*/ binder, OldDynamicAction/*!*/ action, Type/*!*/ type, string/*!*/ name) { if (type.IsSealed && type.IsAbstract) { // static types don't have PythonOperationKind return MemberGroup.EmptyGroup; } // try mapping __*__ methods to .NET method names PythonOperationKind opMap; EnsureOperatorTable(); if (_pythonOperatorTable.TryGetValue(name, out opMap)) { if (IncludeOperatorMethod(type, opMap)) { OperatorMapping opInfo; if (IsReverseOperator(opMap)) { opInfo = OperatorMapping.GetOperatorMapping(opMap & ~PythonOperationKind.Reversed); } else { opInfo = OperatorMapping.GetOperatorMapping(opMap); } if (opInfo != null) { foreach (Type curType in binder.GetContributingTypes(type)) { if (curType == typeof(BigInteger) && (opInfo.Operator == PythonOperationKind.Mod || opInfo.Operator == PythonOperationKind.RightShift || opInfo.Operator == PythonOperationKind.LeftShift || opInfo.Operator == PythonOperationKind.Compare || opInfo.Operator == PythonOperationKind.Divide)) { // we override these with our own modulus/power PythonOperationKind which are different from BigInteger. continue; } Debug.Assert(opInfo.Name != "Equals"); MemberGroup res = GetBaseHelperOverloads(type, opInfo.Name, binder.GetMember(curType, opInfo.Name)); if (res.Count == 0 && opInfo.AlternateName != null) { res = binder.GetMember(curType, opInfo.AlternateName); if (opInfo.AlternateName == "Equals") { // "Equals" is available as an alternate method name. Because it's also on object and Python // doesn't define it on object we need to filter it out. res = FilterObjectEquality(res); } else { res = GetBaseHelperOverloads(type, opInfo.AlternateName, res); } } if (res.Count > 0) { return FilterForwardReverseMethods(name, res, type, opMap); } } } } } if (name == "__call__") { MemberGroup res = binder.GetMember(type, "Call"); if (res.Count > 0) { return res; } } return MemberGroup.EmptyGroup; }
/// <summary> /// Looks for an Equals overload defined on the type and if one is present binds __ne__ to an /// InstanceOps helper. /// </summary> private static MemberGroup/*!*/ FallbackInequalityResolver(MemberBinder/*!*/ binder, Type/*!*/ type) { // if object defines __eq__ then we can call the reverse version if (IncludeOperatorMethod(type, PythonOperationKind.NotEqual)) { foreach (Type curType in binder.GetContributingTypes(type)) { MemberGroup mg = binder.GetMember(curType, "Equals"); foreach (MemberTracker mt in mg) { if (mt.MemberType != TrackerTypes.Method || mt.DeclaringType == typeof(object)) { continue; } MethodTracker method = (MethodTracker)mt; if ((method.Method.Attributes & MethodAttributes.NewSlot) != 0) { continue; } ParameterInfo[] pis = method.Method.GetParameters(); if (pis.Length == 1) { if (pis[0].ParameterType == typeof(object)) { return new MemberGroup(MethodTracker.FromMemberInfo(typeof(InstanceOps).GetMethod("NotEqualsMethod"), curType)); } } } } } return MemberGroup.EmptyGroup; }
public override MemberGroup/*!*/ ResolveMember(MemberBinder/*!*/ binder, OldDynamicAction/*!*/ action, Type/*!*/ type, string/*!*/ name) { if (name == ".ctor" || name == ".cctor") return MemberGroup.EmptyGroup; // normal binding MemberGroup res; foreach (Type curType in binder.GetContributingTypes(type)) { res = GetBaseHelperOverloads(type, name, FilterSpecialNames(binder.GetMember(curType, name), name, action)); if (res.Count > 0) { return res; } } if (type.IsInterface) { foreach (Type t in type.GetInterfaces()) { res = FilterSpecialNames(binder.GetMember(t, name), name, action); if (res.Count > 0) { return res; } } } return MemberGroup.EmptyGroup; }
public MemberGroup/*!*/ Resolver(MemberBinder/*!*/ binder, Type/*!*/ type) { if (type.IsSealed && type.IsAbstract) { // static types don't have PythonOperationKind return MemberGroup.EmptyGroup; } foreach (Type t in binder.GetContributingTypes(type)) { if (t == typeof(BigInteger)) continue; MemberGroup res = binder.GetMember(t, "op_Power"); if (res.Count > 0) { return FilterForwardReverseMethods(_pythonName, res, type, _op); } res = binder.GetMember(t, "Power"); if (res.Count > 0) { return FilterForwardReverseMethods(_pythonName, res, type, _op); } } return MemberGroup.EmptyGroup; }
private static MemberGroup/*!*/ DirResolver(MemberBinder/*!*/ binder, Type/*!*/ type) { MemberGroup res = binder.GetMember(type, "GetMemberNames"); if (res == MemberGroup.EmptyGroup && !typeof(IPythonObject).IsAssignableFrom(type) && typeof(IDynamicMetaObjectProvider).IsAssignableFrom(type)) { res = GetInstanceOpsMethod(type, "DynamicDir"); } return res; }
public MemberGroup/*!*/ Resolver(MemberBinder/*!*/ binder, Type/*!*/ type) { if (type.IsSealed() && type.IsAbstract()) { // static types don't have PythonOperationKind return MemberGroup.EmptyGroup; } foreach (Type t in binder.GetContributingTypes(type)) { MemberGroup res = binder.GetMember(t, _methodName); if (res.Count > 0) { return FilterForwardReverseMethods(_pythonName, res, type, _op); } } return MemberGroup.EmptyGroup; }
private static MemberGroup/*!*/ DirResolver(MemberBinder/*!*/ binder, Type/*!*/ type) { if (type.GetTypeInfo().IsDefined(typeof(DontMapGetMemberNamesToDirAttribute), true)) { return MemberGroup.EmptyGroup; } MemberGroup res = binder.GetMember(type, "GetMemberNames"); if (res == MemberGroup.EmptyGroup && !typeof(IPythonObject).IsAssignableFrom(type) && typeof(IDynamicMetaObjectProvider).IsAssignableFrom(type)) { res = GetInstanceOpsMethod(type, "DynamicDir"); } return res; }