static Value GetLiteralValue(Thread evalThread, IField fieldInfo) { var constValue = fieldInfo.ConstantValue; if (constValue == null || constValue is string) { return(Eval.CreateValue(evalThread, constValue)); } else if (fieldInfo.Type.IsPrimitiveType()) { Value val = Eval.NewObjectNoConstructor(evalThread, fieldInfo.Type); val.CorGenericValue.SetValue(fieldInfo.Type.GetDefinition().KnownTypeCode, constValue); return(val); } else if (fieldInfo.Type.Kind == TypeKind.Enum) { Value val = Eval.NewObjectNoConstructor(evalThread, fieldInfo.Type); Value backingField = val.GetFieldValue("value__"); var enumType = fieldInfo.Type.GetDefinition().EnumUnderlyingType.GetDefinition().KnownTypeCode; backingField.CorGenericValue.SetValue(enumType, constValue); return(val); } else { throw new NotSupportedException(); } }
static Value GetLiteralValue(DebugFieldInfo fieldInfo) { CorElementType corElemType = (CorElementType)fieldInfo.FieldProps.ConstantType; if (corElemType == CorElementType.CLASS) { // Only null literals are allowed return(Eval.CreateValue(fieldInfo.AppDomain, null)); } else if (corElemType == CorElementType.STRING) { string str = Marshal.PtrToStringUni(fieldInfo.FieldProps.ConstantPtr, (int)fieldInfo.FieldProps.ConstantStringLength); return(Eval.CreateValue(fieldInfo.AppDomain, str)); } else { DebugType type = DebugType.CreateFromType(fieldInfo.AppDomain.Mscorlib, DebugType.CorElementTypeToManagedType(corElemType)); if (fieldInfo.FieldType.IsEnum && fieldInfo.FieldType.GetEnumUnderlyingType() == type) { Value val = Eval.NewObjectNoConstructor((DebugType)fieldInfo.FieldType); Value backingField = val.GetMemberValue("value__"); backingField.CorGenericValue.SetValue(fieldInfo.FieldProps.ConstantPtr); return(val); } else { Value val = Eval.NewObjectNoConstructor(type); val.CorGenericValue.SetValue(fieldInfo.FieldProps.ConstantPtr); return(val); } } }