Exemplo n.º 1
0
        /// <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)));
        }
Exemplo n.º 2
0
        /// <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));
        }
Exemplo n.º 3
0
        /// <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))));
        }