如何在 C# 中获取变量的数据类型?

How can I get the data type of a variable in C#?

提问人:Limeni 提问时间:7/24/2012 最后编辑:AustinWBryanLimeni 更新时间:10/28/2023 访问量:316780

问:

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

我现在有这样的东西:

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

public class Person
{
    public int Name { get; set; }
}
C# 类型

评论

7赞 Jamiec 7/24/2012
你已经定义了类型 -int
0赞 Wiktor Zychla 7/24/2012
这不清楚“找出数据类型”是什么意思。通常,答案是“你只需查看类成员签名,类型就会以明确的方式说明”。您是否打算在运行时检查类成员?
1赞 Steve B 7/24/2012
题外话,但你在这里写的东西最好用 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; } }
1赞 Ksempac 7/24/2012
Jamiec 是对的。静态类型意味着声明将永远设置您的类型。变量 n 只能是声明的类型或继承类型。在你的特定情况下,你选择显示一个 int,这是一个你不能继承的类型,所以 n 只能是一个 int。

答:

3赞 Stephen Oberauer 7/24/2012 #1

使用 GetType() 方法

http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx

0赞 Shyju 7/24/2012 #2

Uaw 方法GetType()

int n = 34;
Console.WriteLine(n.GetType());
string name = "Smome";
Console.WriteLine(name.GetType());
16赞 Dai 7/24/2012 #3

一般来说,你几乎不需要做类型比较,除非你正在做一些反射或接口的事情。尽管如此:

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

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

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

TypeIKnow typed = unknownObject as TypeIKnow;

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

Type typeInformation = unknownObject.GetType();

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

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

以前,您必须这样做:

TypeIKnow knownObject;
if( (knownObject = unknownObject as TypeIKnow) != null ) {
    knownObject.SomeMember();
}
4赞 Sergey Berezovskiy 7/24/2012 #4

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

enter image description here

195赞 phoog 7/25/2012 #5

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

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

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

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

object o = "Some string";

变量的静态类型是 ,但在运行时,变量所指对象的类型是 。因此,下一行会将“System.String”打印到控制台:objectstring

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

但是,如果将鼠标悬停在开发环境中的变量上,则会看到类型(或等效关键字)。oSystem.Objectobject

对于值类型变量(如 、、),您知道运行时类型将始终与静态类型相同,因为值类型不能用作其他类型的基类;值类型保证是其继承链中派生最多的类型。对于密封引用类型也是如此:如果静态类型是密封引用类型,则运行时值必须是该类型的实例或 。intdoubleSystem.Guidnull

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

在代码中说明这一点:

// 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));

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

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

您可以在上面的示例中使用此函数:

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

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

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

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

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

而不是

SomeMethod("String");

评论

3赞 barlop 12/24/2015
所以返回运行时类型(右侧类型),但返回静态类型(变量的左侧类型)的是什么?variable.getType()
0赞 phoog 12/25/2015
@barlop在编译时是已知的。可用于在运行时获取静态类型的类型对象。typeof
0赞 barlop 12/25/2015
是的,我知道静态类型=编译时类型,运行时类型=动态类型。虽然重新获取变量“a”的类型,但如果你这样做将返回 int,但不会检查变量“a”并显示“a”的类型。你可以说你不需要显示“a”的静态类型,可能是这样,但事实是它没有显示它。所以我不明白在这里使用 typeof 有什么用。typeof(a)typeof(int)
6赞 phoog 12/25/2015
@barlop你可以这样做,让类型推断为你处理它:Type GetStaticType < T > (T x) { return typeof(T); }
1赞 phoog 10/6/2019
@Jaquarh您可能已经注意到,现在支持类型测试的模式匹配(运行时类型,而不是静态类型)。无需打开从 GetType() 返回的值,而是直接打开变量。switch
24赞 Sagar Chavan 3/29/2014 #6

它非常简单

variable.GetType().Name

它将返回变量的数据类型

评论

3赞 phoog 8/15/2021
这是不正确的:返回 ,而不是 。object o = "Hi!"; return o.GetType().Name;"String""Object"
3赞 Acerby 7/26/2016 #7

一种选择是使用帮助程序扩展方法,如下所示:

public static class MyExtensions
{
    public static System.Type Type<T>(this T v) => typeof(T);
}

var i = 0;
console.WriteLine(i.Type().FullName);
-1赞 Kiran Solkar 8/9/2017 #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.");
0赞 Coding Gaming 10/14/2021 #9

使用方法,这将完成工作。Object.GetType

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

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