string GetEnumValue(CorType type, out byte[] bytes) { bytes = null; Debug.Assert(type != null && type.IsEnum); if (text == string.Empty) return dnSpy_Debugger_Resources.LocalsEditValue_Error_EnterSomeText; var etype = type.EnumUnderlyingType; if (etype == CorElementType.End) return "Internal error: type is not an enum"; var consts = text.Split('|').Select(a => a.Trim()).ToArray(); bool isFlagsAttr = type.HasAttribute("System.FlagsAttribute"); var fields = type.GetFields(false).Where(a => a.Constant != null && (a.Attributes & (FieldAttributes.Literal | FieldAttributes.Static)) == (FieldAttributes.Literal | FieldAttributes.Static)); bool isInteger = !(etype == CorElementType.R4 || etype == CorElementType.R8); if (isFlagsAttr && isInteger) { var dict = new Dictionary<string, object>(); foreach (var f in fields) { if (!dict.ContainsKey(f.Name)) dict[f.Name] = f.Constant; } ulong value = 0; foreach (var c in consts) { ulong? newv; object o; string error; if (dict.TryGetValue(c, out o)) newv = IntegerToUInt64ZeroExtend(o); else newv = ParseIntegerConstant(etype, c, out error); if (newv == null) return string.Format(dnSpy_Debugger_Resources.LocalsEditValue_Error_UnknownEnumValue, c); value |= newv.Value; } bytes = Convert(etype, ConvertUInt64(etype, value)); if (bytes != null) return null; } else { if (consts.Length != 1) return dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue; var c = consts[0]; foreach (var field in fields) { if (field.Name == c) { bytes = Convert(etype, field.Constant); if (bytes != null) return null; } } if (isInteger) { string error; var newv = ParseIntegerConstant(etype, c, out error); if (newv != null) { bytes = Convert(etype, ConvertUInt64(etype, newv.Value)); if (bytes != null) return null; } } else { if (etype == CorElementType.R4) { float v; if (float.TryParse(c, out v)) { bytes = BitConverter.GetBytes(v); return null; } } else { Debug.Assert(etype == CorElementType.R8); double v; if (double.TryParse(c, out v)) { bytes = BitConverter.GetBytes(v); return null; } } } } return dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue; }
string GetEnumValue(CorType type, out byte[] bytes) { bytes = null; Debug.Assert(type != null && type.IsEnum); if (text == string.Empty) { return(dnSpy_Debugger_Resources.LocalsEditValue_Error_EnterSomeText); } var etype = type.EnumUnderlyingType; if (etype == CorElementType.End) { return("Internal error: type is not an enum"); } var consts = text.Split('|').Select(a => a.Trim()).ToArray(); bool isFlagsAttr = type.HasAttribute("System.FlagsAttribute"); var fields = type.GetFields(false).Where(a => a.Constant != null && (a.Attributes & (FieldAttributes.Literal | FieldAttributes.Static)) == (FieldAttributes.Literal | FieldAttributes.Static)); bool isInteger = !(etype == CorElementType.R4 || etype == CorElementType.R8); if (isFlagsAttr && isInteger) { var dict = new Dictionary <string, object>(); foreach (var f in fields) { if (!dict.ContainsKey(f.Name)) { dict[f.Name] = f.Constant; } } ulong value = 0; foreach (var c in consts) { ulong? newv; object o; string error; if (dict.TryGetValue(c, out o)) { newv = IntegerToUInt64ZeroExtend(o); } else { newv = ParseIntegerConstant(etype, c, out error); } if (newv == null) { return(string.Format(dnSpy_Debugger_Resources.LocalsEditValue_Error_UnknownEnumValue, c)); } value |= newv.Value; } bytes = Convert(etype, ConvertUInt64(etype, value)); if (bytes != null) { return(null); } } else { if (consts.Length != 1) { return(dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue); } var c = consts[0]; foreach (var field in fields) { if (field.Name == c) { bytes = Convert(etype, field.Constant); if (bytes != null) { return(null); } } } if (isInteger) { string error; var newv = ParseIntegerConstant(etype, c, out error); if (newv != null) { bytes = Convert(etype, ConvertUInt64(etype, newv.Value)); if (bytes != null) { return(null); } } } else { if (etype == CorElementType.R4) { float v; if (float.TryParse(c, out v)) { bytes = BitConverter.GetBytes(v); return(null); } } else { Debug.Assert(etype == CorElementType.R8); double v; if (double.TryParse(c, out v)) { bytes = BitConverter.GetBytes(v); return(null); } } } } return(dnSpy_Debugger_Resources.LocalsEditValue_Error_InvalidEnumValue); }
public bool HasAttribute(string attributeName) => debugger.Dispatcher.UI(() => type.HasAttribute(attributeName));