我有一个IClaimsPrincipal
变量,我想知道其中有多少声明。浏览监视窗口中的属性很复杂,因此我想自定义此对象的显示方式。
我知道[DebuggerTypeProxy]
attribute,最初看起来可能会做我想要的。不幸的是,它需要附在课堂上,而且我并不“拥有”这门课程。在这种情况下,它是Microsoft.IdentityModel.Claims.ClaimsPrincipal
。
我想显示IClaimsPrincipal.Identities[0].Claims.Count
的价值。
有没有办法,使用[DebuggerTypeProxy]
或类似方法来自定义监视窗口中显示我不拥有的类型的值的方式?
答案 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();
}
}
}
在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的功能。使用它,右键单击该值,选择“添加自定义表达式”,然后键入:
请注意,您甚至可以输入表达式的友好名称,即“声明金额”:
输入自定义表达式后,只要将鼠标悬停在变量上,就能看到其结果: