Nullable.GetNullableType方法的行为

时间:2015-10-15 00:42:35

标签: c# reflection nullable

我有一些C#代码来检测一个类型是否可以为空,并且如果是这样的话来获取基础类型:

...
    Log.DebugFormat("type is {0}", type.FullName);
    Type underlyingType = Nullable.GetUnderlyingType(type);
    if (underlyingType != null)
    {
        Log.DebugFormat("underlying type is {0}", underlyingType);
    }
    else
    {
        Log.DebugFormat("underlying type is null");
    }
...

不幸的是,它似乎不起作用。如果类型是可以为空的int,那么这里有一些输出:

...
    type is System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]&
    underlying type is null
...

我见过类似的代码片段似乎有效,所以我不确定为什么我的工作不起作用。我注意到的一件事是类型名称有一个&最后 - 这可能是重要的吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

以下是如何复制您的问题:

void Main()
{
    Type type;

    type = this.GetType().GetMethod("Method").GetParameters()[0].ParameterType;

    Console.WriteLine("type is {0}", type.FullName);
    Type underlyingType = Nullable.GetUnderlyingType(type);
    if (underlyingType != null)
    {
        Console.WriteLine("underlying type is {0}", underlyingType);
    }
    else
    {
        Console.WriteLine("underlying type is null");
    }
}

public void Method(out int? value)
{
    value = 42;
}

我明白了:

type is System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]&
underlying type is null

赠品是名称末尾的&。这意味着它是out参数。因此,您的类型不仅仅是int?,而是out int?

您需要在类型上调用.GetElementType()才能使其按预期工作。

如果我这样做:

type = this.GetType().GetMethod("Method").GetParameters()[0].ParameterType.GetElementType();

然后输出是:

type is System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
underlying type is System.Int32