类型为Null的MethodInfo.GetParameter()

本文关键字:GetParameter MethodInfo Null 类型 | 更新日期: 2023-09-27 18:29:03

我需要使用反射来调用方法。下面是我需要调用的方法:

public static void DoUpdate(int? operatorId, string name, string desc)
{
    // ...do some update work here...
}

我首先需要掌握这个方法的参数,对吧?所以我做了这个代码:

public static object[] GetMethodParms(MethodInfo method, NameValueCollection coll)
{
    var parms = method.GetParameters();
    // ...do some parse work here...
}

好吧,然后发生了一些我认为很奇怪的事情。正如您所看到的,参数"operatorId"是可以为null的,但parms[0]显示它只是一个普通的"System.Int32"。

为什么会发生这种事,有人能给我解释一下吗?

提前谢谢。

编辑#1

我向你道歉。我应该澄清一下:

我知道我可以通过以下代码检查一个类型是否可以为null:

if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) 
{ … }

或者,这里有另一种方式:

var IsNullable = Nullable.GetUnderlyingType(p.ParameterType) !=null;

我不知道为什么MethodInfo.GetParameter()会为一个Nullable(T)参数返回一个普通的底层类型。在我的情况下,"int?operatorId"返回"System.Int32",我希望它是Nullable(int)。

类型为Null的MethodInfo.GetParameter()

您可以检查以下中的Nullable类型

var parms = method.GetParameters();
foreach (ParameterInfo p in parms)
{
    var IsNullable = Nullable.GetUnderlyingType(p.ParameterType) !=null;
}

Nullable.GetUnderlyingType如果不是Nullable类型,则返回null

通常,我们可以检查以下中的可为null的类型

System.Type type = typeof(int?);
Console.WriteLine(type.FullName); // System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

但当我们在运行时使用反射时,它将给出下划线类型,而不是nullbale类型。

int? i = 5;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"   

MSDN中解释的原因如下

对可为null的类型调用GetType会导致装箱操作当类型隐式转换为Object时执行。因此GetType始终返回一个Type对象,该对象表示基础类型,而不是Nullable类型。