类型为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)。
您可以检查以下中的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类型。