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

问题描述 投票:0回答:2

我有一个

IClaimsPrincipal
变量,我想看看其中有多少个声明。在监视窗口中导航属性很复杂,因此我想自定义该对象的显示方式。

我知道

[DebuggerTypeProxy]
属性,最初看起来它可能会做我想要的事情。不幸的是,它需要附加到课程中,而我并不“拥有”该课程。在本例中,它是
Microsoft.IdentityModel.Claims.ClaimsPrincipal

我想显示

IClaimsPrincipal.Identities[0].Claims.Count
的值。

有没有什么方法,使用

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

visual-studio-2012 visual-studio-debugging
2个回答
5
投票

更新:正如 Sod Almigthy 所指出的,这不适用于 VS2022


应用于 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 上测试


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”也是如此。为了避免这种情况,您需要确保所有内容都是完全合格的,这意味着您最终会在监视窗口中看到非常长的表达式。

© www.soinside.com 2019 - 2024. All rights reserved.