11using System ;
22using System . Diagnostics ;
3+ using System . Globalization ;
34using System . Linq ;
45using System . Reflection ;
6+ using System . Runtime . InteropServices ;
57using System . Runtime . Serialization ;
68
79namespace Python . Runtime
@@ -47,6 +49,20 @@ internal NewReference GetDocString()
4749 return Runtime . PyString_FromString ( str ) ;
4850 }
4951
52+ private static string ConvertFlags ( Enum value )
53+ {
54+ Type primitiveType = value . GetType ( ) . GetEnumUnderlyingType ( ) ;
55+ string format = "X" + ( Marshal . SizeOf ( primitiveType ) * 2 ) . ToString ( CultureInfo . InvariantCulture ) ;
56+ var primitive = ( IFormattable ) Convert . ChangeType ( value , primitiveType ) ;
57+ return "0x" + primitive . ToString ( format , null ) ;
58+
59+ }
60+
61+ private static string ConvertValue ( Enum value )
62+ {
63+ Type primitiveType = value . GetType ( ) . GetEnumUnderlyingType ( ) ;
64+ return Convert . ChangeType ( value , primitiveType ) . ToString ( ) ! ;
65+ }
5066
5167 /// <summary>
5268 /// given an enum, write a __repr__ string formatted in the same
@@ -56,54 +72,13 @@ internal NewReference GetDocString()
5672 /// </summary>
5773 /// <param name="inst">Instace of the enum object</param>
5874 /// <returns></returns>
59- private static string getEnumReprString ( object inst )
75+ private static string GetEnumReprString ( Enum inst )
6076 {
6177 var obType = inst . GetType ( ) ;
6278
63- var integralType = obType . GetEnumUnderlyingType ( ) ;
64- var isFlags = obType . IsFlagsEnum ( ) ;
65-
66- string strValue = "" ;
67- switch ( Type . GetTypeCode ( integralType ) )
68- {
69- case TypeCode . SByte :
70- var valueSB = Convert . ToSByte ( inst ) ;
71- strValue = isFlags ? "0x" + valueSB . ToString ( "X2" ) : valueSB . ToString ( ) ;
72- break ;
73- case TypeCode . Byte :
74- var valueB = Convert . ToByte ( inst ) ;
75- strValue = isFlags ? "0x" + valueB . ToString ( "X2" ) : valueB . ToString ( ) ;
76- break ;
77- case TypeCode . Int16 :
78- var valueI16 = Convert . ToInt16 ( inst ) ;
79- strValue = isFlags ? "0x" + valueI16 . ToString ( "X4" ) : valueI16 . ToString ( ) ;
80- break ;
81- case TypeCode . UInt16 :
82- var valueUI16 = Convert . ToUInt16 ( inst ) ;
83- strValue = isFlags ? "0x" + valueUI16 . ToString ( "X4" ) : valueUI16 . ToString ( ) ;
84- break ;
85- case TypeCode . Int32 :
86- var valueI32 = Convert . ToInt32 ( inst ) ;
87- strValue = isFlags ? "0x" + valueI32 . ToString ( "X8" ) : valueI32 . ToString ( ) ;
88- break ;
89- case TypeCode . UInt32 :
90- var valueUI32 = Convert . ToUInt32 ( inst ) ;
91- strValue = isFlags ? "0x" + valueUI32 . ToString ( "X8" ) : valueUI32 . ToString ( ) ;
92- break ;
93- case TypeCode . Int64 :
94- var valueI64 = Convert . ToInt64 ( inst ) ;
95- strValue = isFlags ? "0x" + valueI64 . ToString ( "X16" ) : valueI64 . ToString ( ) ;
96- break ;
97- case TypeCode . UInt64 :
98- var valueUI64 = Convert . ToUInt64 ( inst ) ;
99- strValue = isFlags ? "0x" + valueUI64 . ToString ( "X16" ) : valueUI64 . ToString ( ) ;
100- break ;
101- default :
102- break ;
103- }
104-
79+ string strValue2 = obType . IsFlagsEnum ( ) ? ConvertFlags ( inst ) : ConvertValue ( inst ) ;
10580
106- var repr = $ "<{ obType . Name } .{ inst } : { strValue } >";
81+ var repr = $ "<{ obType . Name } .{ inst } : { strValue2 } >";
10782 return repr ;
10883 }
10984
@@ -118,7 +93,7 @@ private static string getEnumReprString(object inst)
11893 }
11994 if ( co . inst . GetType ( ) . IsEnum )
12095 {
121- return Runtime . PyString_FromString ( getEnumReprString ( co . inst ) ) ;
96+ return Runtime . PyString_FromString ( GetEnumReprString ( ( Enum ) co . inst ) ) ;
12297 }
12398
12499 return ClassBase . tp_repr ( ob ) ;
0 commit comments