【问题标题】:Get The Class Name From an Object Variable从对象变量中获取类名
【发布时间】:2013-08-16 18:13:16
【问题描述】:

我想从 Object 变量中获取指向的类。

例如,如果我有一个 StringBuilder 对象的实例,我随后将一个 Object 变量设置为,我能以某种方式知道 Object 变量指向一个 StringBuilder 对象吗?

例子:

StringBuilder sbText = New StringBuilder();
Object oMyObject = sbText;
// How can I determine that oMyObject points to an instance of StringBuilder object using only oMyObject

我已经尝试在我能想到的所有组合中使用typeof(oMyObject)oMyObject.GetType(),但仍然不断想出Object。 似乎应该有一个相当直接的方法来做到这一点,可能有,但我没有找到它。

我必须不同意用户将此标记为与他们提供链接的问题重复的问题。我的问题的标题可能并不像以前那样清晰(我现在已经改变了一点),两者的答案可能涉及相同的方法,但提出另一个问题的用户正在寻找一种实例化的方法一个对象与另一个对象具有相同的类型。当我只有一个 Object 类型的变量时,我只是在寻找获取类名的方法。通过查看该问题,我永远不会想出 Reed 提供的答案,而且我不记得它曾出现在该网站的搜索或更广泛的 Google 搜索中。

【问题讨论】:

    标签: c# c#-4.0


    【解决方案1】:

    GetType() 应该在运行时提供对象的正确System.Type

    例如,这会打印"StringBuilder":

    StringBuilder sbText = new StringBuilder();
    Object oMyObject = sbText;
    
    Console.WriteLine(oMyObject.GetType().Name);
    

    请注意,如果您只想检查特定的类类型,is(或as)通常比获得Type 更干净:

    StringBuilder sbText = new StringBuilder();
    Object oMyObject = sbText;
    
    //...
    
    StringBuilder sb = oMyObject as StringBuilder;
    if (sb != null)
    {
        // oMyObject was a StringBuilder - you can use sb as needed:
        sb.AppendText("Foo");
    }
    

    【讨论】:

    • 谢谢里德。第一个例子正是我想要的。我需要获取类名(例如:StringBuilder、Widget、MyClass 或其他),而不需要将其与一些硬编码的类列表进行比较。这对我正在做的事情来说是不可能的。再次感谢您的回复。
    【解决方案2】:

    可能是因为您将Type 存储到一个对象中。试试这个:

    Type myType = sbText.GetType();
    

    【讨论】:

      【解决方案3】:

      如何确定 oMyObject 仅使用 oMyObject 指向 StringBuilder 对象的实例

      你可以这样做

      StringBuilder sbText = new StringBuilder();
      Object oMyObject = sbText;
      if (oMyObject is StringBuilder)
      {
         StringBuilder sb = (StringBuilder)oMyObject; // safe now as you know type
         //your code
      }
      

      但是,如果您需要获取您需要在对象上使用GetType 的类型。

      【讨论】:

        【解决方案4】:

        所有这些都会起作用:

        StringBuilder sbText = new StringBuilder();
        Object oMyObject = sbText;
        
        oMyObject is StringBuilder;
        oMyObject.GetType() == typeof(StringBuilder);
        
        StringBuilder test = oMyObject as StringBuilder;
        if (test != null)
        {
          //Do Work
        }
        

        【讨论】:

          【解决方案5】:
          if (oMyObject is StringBuilder) { ... }
          

          【讨论】:

            猜你喜欢
            • 2012-08-30
            • 2014-11-05
            • 1970-01-01
            • 2013-10-08
            • 1970-01-01
            • 2019-07-08
            • 2021-12-01
            • 2014-01-22
            • 2018-07-30
            相关资源
            最近更新 更多