4

我有一个IClaimsPrincipal变量,我想看看其中有多少声明。在监视窗口中浏览属性很复杂,所以我想自定义这个对象的显示方式。

我知道[DebuggerTypeProxy]属性,最初看起来它可能会做我想要的。不幸的是,它需要附加到班级,我不“拥有”班级。在这种情况下,它是一个Microsoft.IdentityModel.Claims.ClaimsPrincipal.

我想显示IClaimsPrincipal.Identities[0].Claims.Count.

是否有任何方法(使用[DebuggerTypeProxy]或类似方法)来自定义我不拥有的类型的值如何显示在监视窗口中?

4

3 回答 3

5

应用于 KeyValuePair的DebuggerTypeProxyAttribute示例仅显示 Value 成员:

using System.Collections.Generic;
using System.Diagnostics;

[assembly: DebuggerTypeProxy(typeof(ConsoleApp2.KeyValuePairDebuggerTypeProxy<,>), Target = typeof(KeyValuePair<,>))]
// alternative format [assembly: DebuggerTypeProxy(typeof(ConsoleApp2.KeyValuePairDebuggerTypeProxy<,>), TargetTypeName = "System.Collections.Generic.KeyValuePair`2")]

namespace ConsoleApp2
{
    class KeyValuePairDebuggerTypeProxy<TKey, TValue>
    {
        private KeyValuePair<TKey, TValue> _keyValuePair; // beeing non-public this member is hidden
        //public TKey Key => _keyValuePair.Key;
        public TValue Value => _keyValuePair.Value;

        public KeyValuePairDebuggerTypeProxy(KeyValuePair<TKey, TValue> keyValuePair)
        {
            _keyValuePair = keyValuePair;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var dictionary = new Dictionary<int, string>() { [1] = "one", [2] = "two" };
            Debugger.Break();
        }
    }
}

在此处输入图像描述

在 Visual Studio 2017 上测试

于 2018-04-05T14:20:03.567 回答
1

我自己也有很多次相同的需求,所以我在一个名为“ BugAid ”的商业工具中创建了一个名为“自定义表达式”的功能。使用它,您右键单击该值,选择“添加自定义表达式”,然后输入:

自定义表达式

请注意,您甚至可以为表达式输入一个友好的名称,即“索赔金额”:

输入自定义表达式后,只要将鼠标悬停在变量上,您就可以看到其结果:

自定义表达式 2

于 2012-12-22T08:37:51.973 回答
1

到目前为止,我想出的最好的方法是调用一个方法:

public static class DebuggerDisplays
{
    public static int ClaimsPrincipal(IClaimsPrincipal claimsPrincipal)
    {
        return claimsPrincipal.Identities[0].Claims.Count;
    }
}

...从观察窗口:

DebuggerDisplays.ClaimsPrincipal(_thePrincipal),ac = 10

,ac”抑制“此表达式会导致副作用并且不会被评估”。

但是,请注意,当超出范围时,Visual Studio 将简单地使监视窗口条目变灰,即使使用“,ac”也是如此。为避免这种情况,您需要确保所有内容都是完全限定的,这意味着您最终会在监视窗口中得到非常长的表达式。

于 2012-12-18T09:44:21.150 回答