【问题标题】:How to determine type of a variable? (not the type of the object)如何确定变量的类型? (不是对象的类型)
【发布时间】:2012-11-21 11:05:43
【问题描述】:

我在 Visual Studio 的即时窗口中。有一个变量p。如何推断变量p的类型?

我尝试了p.GetType(),但它返回了 object p 的类型。就我而言,这是一种非常特殊的类型(例如,有时是ChessPlayer,有时是TennisPlayer)。我想知道变量的类型,即。确定变量 p 上可用方法的类型。


编辑:我认为这是一件合理的事情。我正在尝试检查变量p,但我不知道它是!通常在 Visual Studio 中,我只需将鼠标悬停在变量上,它就会告诉我它的类型,或者我输入 .,自动完成会列出它的方法。但是这些在即时窗口中都不起作用,我只有这个变量p 我不知道它是什么或者我能用它做什么:(

【问题讨论】:

  • 你试过p.GetType().GetMethods()吗? p.GetType().GetInterfaces()?
  • 虽然我很好奇是否有办法做到这一点,但如果没有,我不会感到惊讶。如果您在带有p 句柄的调试器中,您可以查看代码中p 的声明,从而查看它的“变量”类型是什么。
  • 澄清一下,在执行BoardGamePlayer p = new ChessPlayer(); 时,您想要的是一种知道p 被声明为BoardGamePlayer 的方法?
  • 为了满足我的好奇心,你为什么想要那个?根据定义,您正在寻找的信息在编译时是已知的。尝试动态检索它有什么意义?无论您真正想要做什么,都可能有更简单的方法。

标签: c# .net visual-studio immediate-window


【解决方案1】:

c#为此提供了许多方法:)

对于特定类型的确切副本,您需要这样做

if (p.GetType() == typeof(YourDesiredType))

如果你想知道 p 是否是 yourdesiredtype 的一个实例,那么

if (p is YourDesiredType)

或者你可以试试这个

YourDesiredType ydp = p as YourDesiredType;

在这种情况下(因为我不确定在你的场景中是否有可能)当 OP 想知道编译类型时,我只建议为此使用通用列表

因为通过保持类型安全列表,每个人都可以轻松跟踪其类型

【讨论】:

  • 这都是检查运行时类型。 OP 对编译时类型感兴趣。
  • 他刚刚清除了这一点。我认为没有必要投反对票:(有人这样做了
【解决方案2】:

没想到这么难,最后我写了这个方法,似乎给出了正确的答案。

public static class Extensions
{
    public static Type GetVariableType<T>(this T instance)
    {
        return typeof(T);
    }
}

示例用法:

void Main()
{
    IList x = new List<int>{};
    x.GetVariableType().Dump();
}

打印System.Collections.IList

【讨论】:

    【解决方案3】:

    作为使用即时窗口的替代方法,如果您只想查看变量的类型,您可以简单地添加变量监视并在监视窗口中检查类型。

    【讨论】:

      【解决方案4】:
      System.Object.GetType()
      

      这将返回变量的类型,因为这个类位于每个类派生的层次结构的顶部。

      您还可以检查 typeof 函数以获取给定实例的确切类型。

      【讨论】:

      • OP 说他已经尝试过GetType。他想要p 的编译类型,而不是运行时类型。
      • 好吧,那么 typeof 可能是解决这个问题的方法。
      【解决方案5】:

      我想你可能需要这个

      if (p is ChessPlayer)
      {
          ChessPlayer cp = (ChessPlayer)p;
      
          //Use ChessPlayer methods
      }
      

      【讨论】:

        猜你喜欢
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 2016-09-06
        • 2011-01-14
        • 2015-01-18
        • 2011-08-21
        相关资源
        最近更新 更多