diff --git a/src/runtime/Types/DynamicClassObject.cs b/src/runtime/Types/DynamicClassObject.cs index cdba2950a..2aa4b935a 100644 --- a/src/runtime/Types/DynamicClassObject.cs +++ b/src/runtime/Types/DynamicClassObject.cs @@ -66,7 +66,7 @@ private static CallSite> SetAttrCallSite( /// public static NewReference tp_getattro(BorrowedReference ob, BorrowedReference key) { - if (!HasNonDynamicMember(ob, key, out var result)) + if (!TryGetNonDynamicMember(ob, key, out var result)) { var clrObj = (CLRObject)GetManagedObject(ob)!; @@ -100,23 +100,14 @@ public static NewReference tp_getattro(BorrowedReference ob, BorrowedReference k /// public static int tp_setattro(BorrowedReference ob, BorrowedReference key, BorrowedReference val) { - var clrObj = (CLRObject)GetManagedObject(ob)!; - var name = Runtime.GetManagedString(key); - - // If the key corresponds to a valid property or field of the class, we let the default implementation handle it. - var clrObjectType = clrObj.inst.GetType(); - var bindingFlags = BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic; - var property = clrObjectType.GetProperty(name, bindingFlags); - var field = property == null ? clrObjectType.GetField(name, bindingFlags) : null; - if ((property != null && property.SetMethod != null) || - field != null || - // Not defined as property in the class, try with the snake case version of it before letting DynamicObject handle it. - HasNonDynamicMember(ob, key, out _, clearExceptions: true)) + if (TryGetNonDynamicMember(ob, key, out _, clearExceptions: true)) { return Runtime.PyObject_GenericSetAttr(ob, key, val); } - var callsite = SetAttrCallSite(name, clrObjectType); + var clrObj = (CLRObject)GetManagedObject(ob)!; + var name = Runtime.GetManagedString(key); + var callsite = SetAttrCallSite(name, clrObj.inst.GetType()); try { callsite.Target(callsite, clrObj.inst, PyObject.FromNullableReference(val)); @@ -130,7 +121,7 @@ public static int tp_setattro(BorrowedReference ob, BorrowedReference key, Borro return 0; } - private static bool HasNonDynamicMember(BorrowedReference ob, BorrowedReference key, out NewReference value, bool clearExceptions = false) + private static bool TryGetNonDynamicMember(BorrowedReference ob, BorrowedReference key, out NewReference value, bool clearExceptions = false) { value = Runtime.PyObject_GenericGetAttr(ob, key); // If AttributeError was raised, we try to get the attribute from the managed object dynamic properties.