【问题标题】:How the Visual Studio debugger infer Value inside watch window?Visual Studio 调试器如何在监视窗口中推断值?
【发布时间】:2016-05-21 21:43:12
【问题描述】:

例如,在监视窗口中我看到:

名称:任务
:Id = 11,状态 = WaitingToRun,方法 = "Void<RetreiveFromCache>b__0()"
类型:System.Threading.Tasks.Task

所以task 变量属于Task 类型,我想访问调试器打印的相同值,特别是我对Method 值感兴趣(RetreiveFromCache

但是在 task 变量上,我只能访问 .Id、.Status 等...但不能访问 .Method

Method 值从何而来?

调试器如何“推断”Method 值?

【问题讨论】:

  • 您要转储整个值列表吗?或特定对象
  • 这是System.Threading.Tasks.Task 还是其他类型的任务?我可以获取 Id、Status 和 Type,但不能获取 Method。
  • 是的...这正是我正在寻找的 Method 值!
  • @spiderman77,我已经编辑了我的答案,以展示如何获得运行方法。

标签: c# watch


【解决方案1】:

Task 对象的Action 变量不可访问。您可以做的是创建自己的类来扩展Task 的功能,同时公开 Action(其中包含有关要运行的方法的信息)。

一个简单的例子:

public class CustomTask : Task
{
    private Action m_action;

    public Action Action
    {
        get { return m_action; }
    }

    public CustomTask(Action action) : base(action)
    {
        m_action = action;
    }
}

然后在你的代码中,你可以这样使用它:

CustomTask ct = new CustomTask(MyMethod);

Console.WriteLine("ID: {0}, Method: {1}, Status: {2}", ct.Id, ct.Action.Method, ct.Status);
//Prints: "ID: 1, Method: Void MyMethod(), Status: Created"

ct.Start();
Console.WriteLine("ID: {0}, Method: {1}, Status: {2}", ct.Id, ct.Action.Method, ct.Status);
//Prints: "ID: 1, Method: Void MyMethod(), Status: WaitingToRun"

ct.Wait();
Console.WriteLine("ID: {0}, Method: {1}, Status: {2}", ct.Id, ct.Action.Method, ct.Status);
//Prints: "ID: 1, Method: Void MyMethod(), Status: RanToCompletion"

请注意,要访问有关该方法的信息,您必须访问ct.Action.Method

【讨论】:

    【解决方案2】:

    你可以重写 ToString() 方法。这是简单的方法 但是您正在寻找的是这些类:

    • DebuggerDisplayAttribute
    • DebuggerBrowsableAttribute

    更多信息请参见https://msdn.microsoft.com/es-es/library/ms228992(v=vs.110).aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      • 1970-01-01
      • 2015-02-11
      • 1970-01-01
      相关资源
      最近更新 更多