提问人:Limeni 提问时间:7/24/2012 最后编辑:AustinWBryanLimeni 更新时间:10/28/2023 访问量:316780
如何在 C# 中获取变量的数据类型?
How can I get the data type of a variable in C#?
问:
如何找出某个变量所持有的数据类型?(例如 int、string、char 等)
我现在有这样的东西:
private static void Main()
{
var someone = new Person();
Console.WriteLine(someone.Name.typeOf());
}
public class Person
{
public int Name { get; set; }
}
答:
使用 GetType() 方法
http://msdn.microsoft.com/en-us/library/system.object.gettype.aspx
Uaw 方法GetType()
例
int n = 34;
Console.WriteLine(n.GetType());
string name = "Smome";
Console.WriteLine(name.GetType());
一般来说,你几乎不需要做类型比较,除非你正在做一些反射或接口的事情。尽管如此:
如果您知道要与之进行比较的类型,请使用 or 运算符:is
as
if( unknownObject is TypeIKnow ) { // run code here
运算符执行强制转换,如果失败,则返回 null,而不是异常:as
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();
}
只需将光标悬停在您感兴趣的成员上,然后查看工具提示 - 它将显示成员的类型:
其他答案为这个问题提供了很好的帮助,但有一个重要而微妙的问题,它们都没有直接解决。在 C# 中有两种考虑类型的方法:静态类型和运行时类型。
静态类型是源代码中变量的类型。因此,它是一个编译时概念。这是将鼠标悬停在开发环境中的变量或属性上时在工具提示中看到的类型。
运行时类型是内存中对象的类型。因此,它是一个运行时概念。这是该方法返回的类型。GetType()
对象的运行时类型通常不同于保存或返回它的变量、属性或方法的静态类型。例如,您可以有如下代码:
object o = "Some string";
变量的静态类型是 ,但在运行时,变量所指对象的类型是 。因此,下一行会将“System.String”打印到控制台:object
string
Console.WriteLine(o.GetType()); // prints System.String
但是,如果将鼠标悬停在开发环境中的变量上,则会看到类型(或等效关键字)。o
System.Object
object
对于值类型变量(如 、、),您知道运行时类型将始终与静态类型相同,因为值类型不能用作其他类型的基类;值类型保证是其继承链中派生最多的类型。对于密封引用类型也是如此:如果静态类型是密封引用类型,则运行时值必须是该类型的实例或 。int
double
System.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));
另一位用户编辑了这个答案,以合并一个出现在注释下方的函数,这是一个通用的帮助程序方法,用于在运行时使用类型推断来获取对变量静态类型的引用,这要归功于: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");
评论
variable.getType()
typeof
typeof(a)
typeof(int)
Type GetStaticType < T > (T x) { return typeof(T); }
switch
它非常简单
variable.GetType().Name
它将返回变量的数据类型
评论
object o = "Hi!"; return o.GetType().Name;
"String"
"Object"
一种选择是使用帮助程序扩展方法,如下所示:
public static class MyExtensions
{
public static System.Type Type<T>(this T v) => typeof(T);
}
var i = 0;
console.WriteLine(i.Type().FullName);
查看执行此操作的简单方法之一
从控制台读取字符串
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.");
使用方法,这将完成工作。Object.GetType
如果你只想知道变量的类型:
var test = (byte)1;
Console.WriteLine(test.GetType());
评论
int
class Person { public string Name { get; set; } }
class Person { private string m_Name; public string Name { get {return m_Name;} set { m_Name = value; } }