3 // Copyright(c) Microsoft Corporation. All rights reserved.
6 // <OWNER>Microsoft</OWNER>
9 namespace System
.Reflection
13 internal static class MdConstant
15 [System
.Security
.SecurityCritical
] // auto-generated
16 public static unsafe Object
GetValue(MetadataImport scope
, int token
, RuntimeTypeHandle fieldTypeHandle
, bool raw
)
18 CorElementType corElementType
= 0;
23 stringVal
= scope
.GetDefaultValue(token
, out buffer
, out length
, out corElementType
);
25 RuntimeType fieldType
= fieldTypeHandle
.GetRuntimeType();
27 if (fieldType
.IsEnum
&& raw
== false)
29 long defaultValue
= 0;
31 switch (corElementType
)
35 case CorElementType
.Void
:
38 case CorElementType
.Char
:
39 defaultValue
= *(char*)&buffer
;
42 case CorElementType
.I1
:
43 defaultValue
= *(sbyte*)&buffer
;
46 case CorElementType
.U1
:
47 defaultValue
= *(byte*)&buffer
;
50 case CorElementType
.I2
:
51 defaultValue
= *(short*)&buffer
;
54 case CorElementType
.U2
:
55 defaultValue
= *(ushort*)&buffer
;
58 case CorElementType
.I4
:
59 defaultValue
= *(int*)&buffer
;
62 case CorElementType
.U4
:
63 defaultValue
= *(uint*)&buffer
;
66 case CorElementType
.I8
:
67 defaultValue
= buffer
;
70 case CorElementType
.U8
:
71 defaultValue
= buffer
;
75 throw new FormatException(Environment
.GetResourceString("Arg_BadLiteralFormat"));
79 return RuntimeType
.CreateEnum(fieldType
, defaultValue
);
81 else if (fieldType
== typeof(DateTime
))
83 long defaultValue
= 0;
85 switch (corElementType
)
89 case CorElementType
.Void
:
92 case CorElementType
.I8
:
93 defaultValue
= buffer
;
96 case CorElementType
.U8
:
97 defaultValue
= buffer
;
101 throw new FormatException(Environment
.GetResourceString("Arg_BadLiteralFormat"));
105 return new DateTime(defaultValue
);
109 switch (corElementType
)
113 case CorElementType
.Void
:
116 case CorElementType
.Char
:
117 return *(char*)&buffer
;
119 case CorElementType
.I1
:
120 return *(sbyte*)&buffer
;
122 case CorElementType
.U1
:
123 return *(byte*)&buffer
;
125 case CorElementType
.I2
:
126 return *(short*)&buffer
;
128 case CorElementType
.U2
:
129 return *(ushort*)&buffer
;
131 case CorElementType
.I4
:
132 return *(int*)&buffer
;
134 case CorElementType
.U4
:
135 return *(uint*)&buffer
;
137 case CorElementType
.I8
:
140 case CorElementType
.U8
:
141 return (ulong)buffer
;
143 case CorElementType
.Boolean
:
144 // The boolean value returned from the metadata engine is stored as a
145 // BOOL, which actually maps to an int. We need to read it out as an int
146 // to avoid problems on big-endian machines.
147 return (*(int*)&buffer
!= 0);
149 case CorElementType
.R4
:
150 return *(float*)&buffer
;
152 case CorElementType
.R8
:
153 return *(double*)&buffer
;
155 case CorElementType
.String
:
156 // A string constant can be empty but never null.
157 // A nullref constant can only be type CorElementType.Class.
158 return stringVal
== null ? String
.Empty
: stringVal
;
160 case CorElementType
.Class
:
164 throw new FormatException(Environment
.GetResourceString("Arg_BadLiteralFormat"));