我可以在我不拥有的类型上使用类似DebuggerTypeProxyAttribute的东西吗?

时间:2012-12-18 09:33:53

标签: visual-studio-2012 visual-studio-debugging

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

我知道[DebuggerTypeProxy] attribute,最初看起来可能会做我想要的。不幸的是,它需要附在课堂上,而且我并不“拥有”这门课程。在这种情况下,它是Microsoft.IdentityModel.Claims.ClaimsPrincipal

我想显示IClaimsPrincipal.Identities[0].Claims.Count的价值。

有没有办法,使用[DebuggerTypeProxy]或类似方法来自定义监视窗口中显示我不拥有的类型的值的方式?

3 个答案:

答案 0 :(得分:1)

应用于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();
        }
    }
}

enter image description here

在Visual Studio 2017上测试

答案 1 :(得分:0)

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

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

...从观察窗口:

DebuggerDisplays.ClaimsPrincipal(_thePrincipal),ac = 10

",ac" suppresses“此表达式会导致副作用,不会被评估”。

但是,请注意,当这超出范围时,即使使用“,ac”,Visual Studio也会使观察窗口条目变灰。为避免这种情况,您需要确保所有内容都是完全限定的,这意味着您将在观察窗口中以极长的表达式结束。

答案 2 :(得分:0)

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

Custom Expression

请注意,您甚至可以输入表达式的友好名称,即“声明金额”:

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

Custom Expression 2