1
1
using System ;
2
2
using System . Collections . Generic ;
3
+ using System . Reflection ;
4
+ using System . Runtime . InteropServices ;
3
5
#if UNITY_5_3_OR_NEWER
4
6
using Unity . Collections . LowLevel . Unsafe ;
5
7
#endif
@@ -71,6 +73,10 @@ public static int EnumToInt<T>(T value) where T : struct, Enum
71
73
#if UNITY_5_3_OR_NEWER
72
74
return UnsafeUtility . EnumToInt ( value ) ;
73
75
#elif NETCOREAPP3_0_OR_GREATER || NET5_0_OR_GREATER
76
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
77
+ {
78
+ return ( int ) Unsafe . As < T , long > ( ref value ) ;
79
+ }
74
80
return Unsafe . As < T , int > ( ref value ) ;
75
81
#else
76
82
return Convert . ToInt32 ( value ) ;
@@ -80,12 +86,68 @@ public static int EnumToInt<T>(T value) where T : struct, Enum
80
86
public static T IntToEnum < T > ( int value ) where T : Enum
81
87
{
82
88
#if UNITY_5_3_OR_NEWER
89
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
90
+ {
91
+ var longValue = ( long ) value ;
92
+ return UnsafeUtility . As < long , T > ( ref longValue ) ;
93
+ }
83
94
return UnsafeUtility . As < int , T > ( ref value ) ;
84
95
#elif NETCOREAPP3_0_OR_GREATER || NET5_0_OR_GREATER
96
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
97
+ {
98
+ var longValue = ( long ) value ;
99
+ return Unsafe . As < long , T > ( ref longValue ) ;
100
+ }
85
101
return Unsafe . As < int , T > ( ref value ) ;
86
102
#else
87
103
return ( T ) Enum . ToObject ( typeof ( T ) , value ) ;
88
104
#endif
89
105
}
106
+
107
+ public static long EnumToLong < T > ( T value ) where T : struct , Enum
108
+ {
109
+ #if UNITY_5_3_OR_NEWER
110
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
111
+ {
112
+ return UnsafeUtility . As < T , long > ( ref value ) ;
113
+ }
114
+ return UnsafeUtility . EnumToInt ( value ) ;
115
+ #elif NETCOREAPP3_0_OR_GREATER || NET5_0_OR_GREATER
116
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
117
+ {
118
+ return Unsafe . As < T , long > ( ref value ) ;
119
+ }
120
+ return Unsafe . As < T , int > ( ref value ) ;
121
+ #else
122
+ return Convert . ToInt64 ( value ) ;
123
+ #endif
124
+ }
125
+
126
+ public static T LongToEnum < T > ( long value ) where T : Enum
127
+ {
128
+ #if UNITY_5_3_OR_NEWER
129
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
130
+ {
131
+ return UnsafeUtility . As < long , T > ( ref value ) ;
132
+ }
133
+ var intValue = ( int ) value ;
134
+ return UnsafeUtility . As < int , T > ( ref intValue ) ;
135
+ #elif NETCOREAPP3_0_OR_GREATER || NET5_0_OR_GREATER
136
+ if ( EnumMetadata < T > . SizeOf == sizeof ( long ) )
137
+ {
138
+ return Unsafe . As < long , T > ( ref value ) ;
139
+ }
140
+ var intValue = ( int ) value ;
141
+ return Unsafe . As < int , T > ( ref intValue ) ;
142
+ #else
143
+ return ( T ) Enum . ToObject ( typeof ( T ) , value ) ;
144
+ #endif
145
+ }
146
+ }
147
+
148
+ public static class EnumMetadata < T > where T : Enum
149
+ {
150
+ public static int SizeOf = Marshal . SizeOf ( Enum . GetUnderlyingType ( typeof ( T ) ) ) ;
151
+ public static bool HasFlags = typeof ( T ) . IsDefined ( typeof ( FlagsAttribute ) ) ;
90
152
}
91
153
}
0 commit comments