diff --git a/CHANGELOG.md b/CHANGELOG.md
index 4ba0b935c..fb13982e6 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,8 @@ This document follows the conventions laid out in [Keep a CHANGELOG][].
### Added
+- use enum name in repr
+
### Changed
### Fixed
diff --git a/src/runtime/Types/ClassObject.cs b/src/runtime/Types/ClassObject.cs
index cc42039e8..f0585ffa6 100644
--- a/src/runtime/Types/ClassObject.cs
+++ b/src/runtime/Types/ClassObject.cs
@@ -1,7 +1,9 @@
using System;
using System.Diagnostics;
+using System.Globalization;
using System.Linq;
using System.Reflection;
+using System.Runtime.InteropServices;
using System.Runtime.Serialization;
namespace Python.Runtime
@@ -47,6 +49,55 @@ internal NewReference GetDocString()
return Runtime.PyString_FromString(str);
}
+ private static string ConvertFlags(Enum value)
+ {
+ Type primitiveType = value.GetType().GetEnumUnderlyingType();
+ string format = "X" + (Marshal.SizeOf(primitiveType) * 2).ToString(CultureInfo.InvariantCulture);
+ var primitive = (IFormattable)Convert.ChangeType(value, primitiveType);
+ return "0x" + primitive.ToString(format, null);
+
+ }
+
+ private static string ConvertValue(Enum value)
+ {
+ Type primitiveType = value.GetType().GetEnumUnderlyingType();
+ return Convert.ChangeType(value, primitiveType).ToString()!;
+ }
+
+ ///
+ /// given an enum, write a __repr__ string formatted in the same
+ /// way as a python repr string. Something like:
+ /// '<Color.GREEN: 2>';
+ /// with a binary value for [Flags] enums
+ ///
+ /// Instace of the enum object
+ ///
+ private static string GetEnumReprString(Enum inst)
+ {
+ var obType = inst.GetType();
+
+ string strValue2 = obType.IsFlagsEnum() ? ConvertFlags(inst) : ConvertValue(inst);
+
+ var repr = $"<{obType.Name}.{inst}: {strValue2}>";
+ return repr;
+ }
+
+ ///
+ /// ClassObject __repr__ implementation.
+ ///
+ public new static NewReference tp_repr(BorrowedReference ob)
+ {
+ if (GetManagedObject(ob) is not CLRObject co)
+ {
+ return Exceptions.RaiseTypeError("invalid object");
+ }
+ if (co.inst.GetType().IsEnum)
+ {
+ return Runtime.PyString_FromString(GetEnumReprString((Enum)co.inst));
+ }
+
+ return ClassBase.tp_repr(ob);
+ }
///
/// Implements __new__ for reflected classes and value types.
diff --git a/tests/test_enum.py b/tests/test_enum.py
index f24f95b36..3d3edba10 100644
--- a/tests/test_enum.py
+++ b/tests/test_enum.py
@@ -143,6 +143,16 @@ def test_enum_undefined_value():
Test.FieldTest().EnumField = Test.ShortEnum(20, True)
+def test_enum_repr():
+ """Test enumeration repr."""
+ from System import DayOfWeek
+
+ assert repr(DayOfWeek.Monday) == ""
+
+ assert repr(Test.FlagsEnum(7)) == ""
+ assert repr(Test.FlagsEnum(8)) == ""
+
+
def test_enum_conversion():
"""Test enumeration conversion."""
ob = Test.FieldTest()