【问题标题】:How can I get the data type of a variable in C#?如何在 C# 中获取变量的数据类型?
【发布时间】:2012-07-22 23:03:31
【问题描述】:

如何找出某个变量所持有的数据类型? (例如 int、string、char 等)

我现在有这样的东西:

private static void Main()
{
   var someone = new Person();
   Console.WriteLine(someone.Name.typeOf());
}

public class Person
{
    public int Name { get; set; }
}

【问题讨论】:

  • 你已经定义了类型 - int
  • 这不清楚您所说的“找出数据类型”是什么意思。通常,答案是“您只需查看类成员签名,并以明确的方式说明类型”。您是否打算在运行时检查班级成员?
  • 超出主题,但你在这里写的最好用 C# 写成这样:class Person { public string Name { get; set; } }class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }。阅读有关Properties的文档
  • Jamiec 是对的。静态类型意味着声明永远设置你的类型。您的变量 n 只能是您声明的类型或继承的类型。在您的特定情况下,您选择显示一个 int,这是您无法继承的类型,因此 n 只能是一个 int。

标签: c# types


【解决方案1】:
【解决方案2】:

GetType()方法

int n = 34;
Console.WriteLine(n.GetType());
string name = "Smome";
Console.WriteLine(name.GetType());

【讨论】:

    【解决方案3】:

    一般来说,您几乎不需要进行类型比较,除非您使用反射或接口进行操作。尽管如此:

    如果您知道要与之比较的类型,请使用 isas 运算符:

    if( unknownObject is TypeIKnow ) { // run code here
    

    as 运算符执行转换,如果失败则返回 null 而不是异常:

    TypeIKnow typed = unknownObject as TypeIKnow;
    

    如果您不知道类型并且只需要运行时类型信息,请使用 .GetType() 方法:

    Type typeInformation = unknownObject.GetType();
    

    在较新版本的 C# 中,您可以使用 is 运算符来声明变量,而无需使用 as

    if( unknownObject is TypeIKnow knownObject ) {
        knownObject.SomeMember();
    }
    

    以前你必须这样做:

    TypeIKnow knownObject;
    if( (knownObject = unknownObject as TypeIKnow) != null ) {
        knownObject.SomeMember();
    }
    

    【讨论】:

      【解决方案4】:

      只需将光标悬停在您感兴趣的成员上,然后查看工具提示 - 它会显示成员的类型:

      【讨论】:

        【解决方案5】:

        其他答案对这个问题提供了很好的帮助,但有一个重要而微妙的问题,它们都没有直接解决。 C#中有两种考虑类型的方法:静态类型运行时类型

        静态类型是源代码中变量的类型。因此,它是一个编译时概念。这是您在开发环境中将鼠标悬停在变量或属性上时在工具提示中看到的类型。

        运行时类型是内存中对象的类型。因此,它是一个运行时概念。这是GetType() 方法返回的类型。

        对象的运行时类型通常不同于保存或返回它的变量、属性或方法的静态类型。例如,你可以有这样的代码:

        object o = "Some string";
        

        变量的静态类型是object,但在运行时,变量的referent类型是string。因此,下一行将打印“System.String”到控制台:

        Console.WriteLine(o.GetType()); // prints System.String
        

        但是,如果您在开发环境中将鼠标悬停在变量 o 上,您将看到类型 System.Object(或等效的 object 关键字)。

        对于值类型的变量,例如intdoubleSystem.Guid,你知道运行时类型总是和静态类型相同,因为值类型不能作为基类对于另一种类型;值类型保证是其继承链中派生最多的类型。对于密封引用类型也是如此:如果静态类型是密封引用类型,则运行时值必须是该类型的实例或 null

        反之,如果变量的静态类型是抽象类型,那么保证静态类型和运行时类型是不同的。

        用代码来说明:

        // int is a value type
        int i = 0;
        // Prints True for any value of i
        Console.WriteLine(i.GetType() == typeof(int));
        
        // string is a sealed reference type
        string s = "Foo";
        // Prints True for any value of s
        Console.WriteLine(s == null || s.GetType() == typeof(string));
        
        // object is an unsealed reference type
        object o = new FileInfo("C:\\f.txt");
        // Prints False, but could be true for some values of o
        Console.WriteLine(o == null || o.GetType() == typeof(object));
        
        // FileSystemInfo is an abstract type
        FileSystemInfo fsi = new DirectoryInfo("C:\\");
        // Prints False for all non-null values of fsi
        Console.WriteLine(fsi == null || fsi.GetType() == typeof(FileSystemInfo));
        

        另一位用户编辑了这个答案以合并下面出现在 cmets 中的一个函数,这是一个通用的帮助方法,用于在运行时使用类型推断来获取对变量静态类型的引用,这要感谢 typeof

        Type GetStaticType<T>(T x) => typeof(T);
        

        你可以在上面的例子中使用这个函数:

        Console.WriteLine(GetStaticType(o)); // prints System.Object
        

        但除非您想保护自己免受重构,否则此功能的实用性有限。当您编写对GetStaticType 的调用时,您已经知道o 的静态类型是对象。你也可以写

        Console.WriteLine(typeof(object)); // also prints System.Object!
        

        这让我想起了我开始当前工作时遇到的一些代码,比如

        SomeMethod("".GetType().Name);
        

        而不是

        SomeMethod("String");
        

        【讨论】:

        • so variable.getType() 返回运行时类型(右侧类型),但返回静态类型(变量左侧类型)是什么?
        • @barlop 在编译时已知。您可以使用typeof 在运行时获取静态类型的类型对象。
        • 是的,我知道静态类型 = 编译时类型,运行时类型 = 动态类型。虽然重新获得了变量“a”的类型,但如果您执行typeof(int),则不能执行typeof(a),它将返回int,但不会检查变量“a”并向您显示“a”的类型。 .你可以说你不需要显示'a'的静态类型,可能是这样,但事实是它没有显示它。所以我看不出这里使用 typeof 有什么用。
        • @barlop 你可以这样做让类型推断为你处理它:Type GetStaticType &lt; T &gt; (T x) { return typeof(T); }
        • @Jaquarh 您可能已经注意到,switch 现在支持用于类型测试的模式匹配(运行时类型,而非静态)。您无需打开从 GetType() 返回的值,而是直接打开变量。
        【解决方案6】:

        很简单

        variable.GetType().Name
        

        它将返回您变量的数据类型

        【讨论】:

        • 这是不正确的:object o = "Hi!"; return o.GetType().Name; 返回 "String",而不是 "Object"
        【解决方案7】:

        一种选择是使用如下的辅助扩展方法:

        public static class MyExtensions
        {
            public static System.Type Type<T>(this T v) => typeof(T);
        }
        
        var i = 0;
        console.WriteLine(i.Type().FullName);
        

        【讨论】:

          【解决方案8】:

          查看其中一种简单的方法

          // 从控制台读取字符串

          string line = Console.ReadLine(); 
          int valueInt;
          float valueFloat;
          
          if (int.TryParse(line, out valueInt)) // Try to parse the string as an integer
              Console.Write("This input is of type Integer.");
          else if (float.TryParse(line, out valueFloat)) 
              Console.Write("This input is of type Float.");
          else
              Console.WriteLine("This input is of type string.");
          

          【讨论】:

            【解决方案9】:

            使用Object.GetType 方法,这样就可以了。

            如果你只想知道变量的类型:

            var test = (byte)1;
            Console.WriteLine(test.GetType());
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2021-02-13
              • 1970-01-01
              • 1970-01-01
              • 2014-09-12
              • 1970-01-01
              • 2021-07-30
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多