如何在运行时获取 Nullable<T> 的类型(T)?

7

我不知道标题里应该写些什么, 我想获取一个可空类型(Nullable)的Type(T)。 举个例子,我有一个对象,它的类型是 Nullable,我想要得到类似于 "System.Int32" 的东西(当然是类型本身,而不是字符串)。


我相信这是一个重复的问题,但找不到它,但你正在寻找Nullable.GetUnderlyingType。可能是https://dev59.com/wFTTa4cB1Zd3GeqPwNdh或https://dev59.com/-m435IYBdhLWcg3w1z0t。 - user7116
http://blog.dotnetclr.com/archive/2008/03/11/get-underlying-type-from-a-nullable-type.aspx - Oded
3
这个问题含混不清。你是否有一个代表可为空值类型的Type对象,想要知道底层的值类型?或者你是否有一个可为空值类型的对象实例,并且想要知道底层的值类型?这两个问题的答案完全不同。在第一种情况下,可以使用GetUnderlyingType方法。在第二种情况下,对象实例可能已经被装箱,也可能没有。如果它已经被装箱了,那么它就不是可空类型。不存在装箱的可空值类型这样的事情。如果它没有被装箱,那么你已经知道它的类型 - Eric Lippert
我有一个代表对象的类型。例如,我可以使用Activator.CreateInstance,但在我看来这可能是无用的,因为我可以从Type中获取我想要的内容! - Guillaume Slashy
6个回答

12

哇,我不知道这个存在,非常好! - Kolky
出现以下错误: 错误1:'System.Nullable'不包含“GetUnderylingType”的定义。 - Guillaume Slashy
我的测试显示 Nullable.GetUnderlyingType(new Nullable<int>(2)) 返回 null。 但是使用 GetType() 就可以了,详见下面的答案。 - Casperah
你是否正在使用“System”引用? - Steven Muhr
没错,System.Nullable.GetUnderylingType(...). 无论如何,另一个答案很好用 :) - Guillaume Slashy
2
是的。Nullable.GetUnderlyingType已经在.Net 2.0中添加了。我建议您使用此方法来获取底层类型。它更加简洁。 - Steven Muhr

2
这个方法应该能解决问题:
Type GetValueType(Type t)
{
   return t.GetGenericArguments().First();
}

1

使用 GetType(),它的工作方式和预期一样。

if (typeof(int?) == typeof(int))
    MessageBox.Show("It works with definitions");
if (new Nullable<int>(2).GetType() == typeof(int))
    MessageBox.Show("It works with instances!");

这个示例代码将显示最后一个消息框。 GetType() 将返回底层类型。


0
一个 Nullable 是一个通用构造,所以你应该从类型的 GenericArguments 中获取它,像这样:typeof(T).GetGenericArguments()[0]

0
System.Nullable.GetUnderlyingType(typeof(Nullable<int>));

如果myInt当前为null,这将抛出NullReferenceException。 - David Ruttka

0

警告:糟糕的代码,没有检查,只是一个例子等等:

using System;

static class Program {

    public static void Main(params string[] args) {
        Type t = typeof(int?);
        Type genericArgument = t.GetGenericArguments()[0];
        Console.WriteLine(genericArgument.FullName);
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接