/// <summary> /// 创建指定成员表达式的的格式化方法的委托。 /// </summary> /// <param name="type">成员所在的类型。</param> /// <param name="name">要访问的成员的名称;对于方法调用,应以 <c>()</c> 结尾。</param> /// <param name="format">成员的格式化方法;应为 <c>nq</c> 或 <c>raw</c>,或为空值。</param> /// <returns><paramref name="type"/> 类型中名为 <paramref name="name"/> /// 的成员按照 <paramref name="format"/> 指定的格式进行格式化的方法的委托。</returns> private static Func <object, string?> CreateMemberFormatter(Type type, string name, string format) { var accessor = DebuggerDisplay.CreateMemberAccessor(type, name); var formatter = DebuggerDisplay.CreateValueFormatter(format); return(instance => formatter.Invoke(accessor.Invoke(instance))); }
/// <summary> /// 将指定对象表示为 <see cref="DebuggerDisplayAttribute"/> 指定的格式。 /// </summary> /// <param name="instance">要进行格式化表示的对象。</param> /// <returns><paramref name="instance"/> 按照 /// <see cref="DebuggerDisplayAttribute"/> 格式化得到的字符串。</returns> public static string?Format(object instance) { if (instance == null) { return(null); } var type = instance.GetType(); var formatter = DebuggerDisplay.Formatters.GetOrAdd(type, newType => DebuggerDisplay.CreateFormatter(type)); return(formatter.Invoke(instance)); }
/// <summary> /// 创建指定类型的 <see cref="DebuggerDisplayAttribute"/> 的格式化方法的委托。 /// </summary> /// <param name="type">要创建格式化方法的对象的类型。</param> /// <returns><paramref name="type"/> 类型的 /// <see cref="DebuggerDisplayAttribute"/> 的格式化方法的委托。</returns> private static Func <object, string?> CreateFormatter(Type type) { var index = 0; var display = DebuggerDisplay.GetFormat(type); if (display is null) { return(instance => instance?.ToString()); } var format = ExpressionMatcher.Replace(display, match => (index++).ToString()); var formatters = ExpressionMatcher.Matches(display).Cast <Match>() .Select(match => new StringPair(match.Groups[1].Value, match.Groups[3].Value)) .Select(member => DebuggerDisplay.CreateMemberFormatter(type, member.Key, member.Value)) .ToArray(); return(instance => string.Format(format, Array.ConvertAll(formatters, formatter => formatter.Invoke(instance)))); }