@@ -32,7 +32,7 @@ private ref struct Counters
3232 public int Val128Counter ;
3333 }
3434
35- private static class ValueFieldAccessorResolver
35+ private static class ValueFieldAccessorResolver
3636 {
3737 private static readonly ValueFieldAccessor BoolAccessor = new BooleanFieldAccessor ( ) ;
3838 private static readonly ValueFieldAccessor ByteAccessor = new ByteFieldAccessor ( ) ;
@@ -60,56 +60,75 @@ private static class ValueFieldAccessorResolver
6060 public static ValueFieldAccessor GetValue ( Type probeType )
6161 {
6262 return ( probeType . MetadataToken ^ NullableTypeMetadataToken ) == 0
63- ? ResolveByNullableType ( probeType )
64- : ResolveByType ( probeType ) ;
65-
66- ValueFieldAccessor ResolveByType ( Type type )
67- {
68- return ReferenceEquals ( type , WellKnownTypes . Int64 ) ? Int64Accessor :
69- ReferenceEquals ( type , WellKnownTypes . Guid ) ? GuidAccessor :
70- ReferenceEquals ( type , WellKnownTypes . Int32 ) ? Int32Accessor :
71- ReferenceEquals ( type , WellKnownTypes . Bool ) ? BoolAccessor :
72- ReferenceEquals ( type , WellKnownTypes . DateTime ) ? DateTimeAccessor :
73- ReferenceEquals ( type , WellKnownTypes . TimeSpan ) ? TimeSpanAccessor :
74- ReferenceEquals ( type , WellKnownTypes . Double ) ? DoubleAccessor :
75- ReferenceEquals ( type , WellKnownTypes . Decimal ) ? DecimalAccessor :
76- ReferenceEquals ( type , WellKnownTypes . Single ) ? SingleAccessor :
77- ReferenceEquals ( type , WellKnownTypes . DateTimeOffset ) ? DateTimeOffsetAccessor :
63+ ? ( ResolveByNullableType ( probeType ) ?? TryResolveEnum ( probeType ) )
64+ : ( ResolveByType ( probeType ) ?? TryResolveEnum ( probeType ) ) ;
65+ }
66+
67+ private static ValueFieldAccessor ResolveByType ( Type type )
68+ {
69+ return ReferenceEquals ( type , WellKnownTypes . Int64 ) ? Int64Accessor :
70+ ReferenceEquals ( type , WellKnownTypes . Guid ) ? GuidAccessor :
71+ ReferenceEquals ( type , WellKnownTypes . Int32 ) ? Int32Accessor :
72+ ReferenceEquals ( type , WellKnownTypes . Bool ) ? BoolAccessor :
73+ ReferenceEquals ( type , WellKnownTypes . DateTime ) ? DateTimeAccessor :
74+ ReferenceEquals ( type , WellKnownTypes . TimeSpan ) ? TimeSpanAccessor :
75+ ReferenceEquals ( type , WellKnownTypes . Double ) ? DoubleAccessor :
76+ ReferenceEquals ( type , WellKnownTypes . Decimal ) ? DecimalAccessor :
77+ ReferenceEquals ( type , WellKnownTypes . Single ) ? SingleAccessor :
78+ ReferenceEquals ( type , WellKnownTypes . DateTimeOffset ) ? DateTimeOffsetAccessor :
7879#if NET6_0_OR_GREATER
79- ReferenceEquals ( type , WellKnownTypes . DateOnly ) ? DateOnlyAccessor :
80- ReferenceEquals ( type , WellKnownTypes . TimeOnly ) ? TimeOnlyAccessor :
80+ ReferenceEquals ( type , WellKnownTypes . DateOnly ) ? DateOnlyAccessor :
81+ ReferenceEquals ( type , WellKnownTypes . TimeOnly ) ? TimeOnlyAccessor :
8182#endif
82- ReferenceEquals ( type , WellKnownTypes . Int16 ) ? Int16Accessor :
83- ReferenceEquals ( type , WellKnownTypes . Byte ) ? ByteAccessor :
84- ReferenceEquals ( type , WellKnownTypes . SByte ) ? SByteAccessor :
85- ReferenceEquals ( type , WellKnownTypes . UInt16 ) ? UInt16Accessor :
86- ReferenceEquals ( type , WellKnownTypes . UInt32 ) ? UInt32Accessor :
87- ReferenceEquals ( type , WellKnownTypes . UInt64 ) ? UInt64Accessor : null ;
88- }
83+ ReferenceEquals ( type , WellKnownTypes . Int16 ) ? Int16Accessor :
84+ ReferenceEquals ( type , WellKnownTypes . Byte ) ? ByteAccessor :
85+ ReferenceEquals ( type , WellKnownTypes . SByte ) ? SByteAccessor :
86+ ReferenceEquals ( type , WellKnownTypes . UInt16 ) ? UInt16Accessor :
87+ ReferenceEquals ( type , WellKnownTypes . UInt32 ) ? UInt32Accessor :
88+ ReferenceEquals ( type , WellKnownTypes . UInt64 ) ? UInt64Accessor : null ;
89+ }
8990
90- ValueFieldAccessor ResolveByNullableType ( Type type )
91- {
92- return ReferenceEquals ( type , WellKnownTypes . NullableBool ) ? BoolAccessor :
93- ReferenceEquals ( type , WellKnownTypes . NullableInt32 ) ? Int32Accessor :
94- ReferenceEquals ( type , WellKnownTypes . NullableDouble ) ? DoubleAccessor :
95- ReferenceEquals ( type , WellKnownTypes . NullableDecimal ) ? DecimalAccessor :
96- ReferenceEquals ( type , WellKnownTypes . NullableInt64 ) ? Int64Accessor :
97- ReferenceEquals ( type , WellKnownTypes . NullableDateTime ) ? DateTimeAccessor :
98- ReferenceEquals ( type , WellKnownTypes . NullableTimeSpan ) ? TimeSpanAccessor :
99- ReferenceEquals ( type , WellKnownTypes . NullableDateTimeOffset ) ? DateTimeOffsetAccessor :
100- ReferenceEquals ( type , WellKnownTypes . NullableSingle ) ? SingleAccessor :
91+ private static ValueFieldAccessor ResolveByNullableType ( Type type )
92+ {
93+ return ReferenceEquals ( type , WellKnownTypes . NullableBool ) ? BoolAccessor :
94+ ReferenceEquals ( type , WellKnownTypes . NullableInt32 ) ? Int32Accessor :
95+ ReferenceEquals ( type , WellKnownTypes . NullableDouble ) ? DoubleAccessor :
96+ ReferenceEquals ( type , WellKnownTypes . NullableDecimal ) ? DecimalAccessor :
97+ ReferenceEquals ( type , WellKnownTypes . NullableInt64 ) ? Int64Accessor :
98+ ReferenceEquals ( type , WellKnownTypes . NullableDateTime ) ? DateTimeAccessor :
99+ ReferenceEquals ( type , WellKnownTypes . NullableTimeSpan ) ? TimeSpanAccessor :
100+ ReferenceEquals ( type , WellKnownTypes . NullableDateTimeOffset ) ? DateTimeOffsetAccessor :
101+ ReferenceEquals ( type , WellKnownTypes . NullableSingle ) ? SingleAccessor :
101102#if NET6_0_OR_GREATER
102- ReferenceEquals ( type , WellKnownTypes . NullableDateOnly ) ? DateOnlyAccessor :
103- ReferenceEquals ( type , WellKnownTypes . NullableTimeOnly ) ? TimeOnlyAccessor :
103+ ReferenceEquals ( type , WellKnownTypes . NullableDateOnly ) ? DateOnlyAccessor :
104+ ReferenceEquals ( type , WellKnownTypes . NullableTimeOnly ) ? TimeOnlyAccessor :
104105#endif
105- ReferenceEquals ( type , WellKnownTypes . NullableGuid ) ? GuidAccessor :
106- ReferenceEquals ( type , WellKnownTypes . NullableInt16 ) ? Int16Accessor :
107- ReferenceEquals ( type , WellKnownTypes . NullableByte ) ? ByteAccessor :
108- ReferenceEquals ( type , WellKnownTypes . NullableSByte ) ? SByteAccessor :
109- ReferenceEquals ( type , WellKnownTypes . NullableUInt16 ) ? UInt16Accessor :
110- ReferenceEquals ( type , WellKnownTypes . NullableUInt32 ) ? UInt32Accessor :
111- ReferenceEquals ( type , WellKnownTypes . NullableUInt64 ) ? UInt64Accessor : null ;
106+ ReferenceEquals ( type , WellKnownTypes . NullableGuid ) ? GuidAccessor :
107+ ReferenceEquals ( type , WellKnownTypes . NullableInt16 ) ? Int16Accessor :
108+ ReferenceEquals ( type , WellKnownTypes . NullableByte ) ? ByteAccessor :
109+ ReferenceEquals ( type , WellKnownTypes . NullableSByte ) ? SByteAccessor :
110+ ReferenceEquals ( type , WellKnownTypes . NullableUInt16 ) ? UInt16Accessor :
111+ ReferenceEquals ( type , WellKnownTypes . NullableUInt32 ) ? UInt32Accessor :
112+ ReferenceEquals ( type , WellKnownTypes . NullableUInt64 ) ? UInt64Accessor : null ;
113+ }
114+
115+ private static ValueFieldAccessor TryResolveEnum ( Type type )
116+ {
117+ if ( ! type . IsEnum ) {
118+ return null ;
119+ }
120+ type = Enum. GetUnderlyingType( type ) ;
121+ return ResolveByType ( type ) ;
122+ }
123+
124+ private static ValueFieldAccessor TryResolveNullableEnum( Type type )
125+ {
126+ var generic = type. GetGenericArguments ( ) [ 0 ] ;
127+ if ( ! generic . IsEnum ) {
128+ return null ;
112129 }
130+ type = Enum . GetUnderlyingType ( generic ) ;
131+ return ResolveByType ( type ) ;
113132 }
114133 }
115134
0 commit comments