0

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

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”为 Nullable,但 parms[0] 表明它只是一个普通的“System.Int32”。

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

提前致谢。

编辑#1

我的道歉。我应该澄清这些:

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

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

或者,这是另一种方式:

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

. 我不知道为什么 MethodInfo.GetParameter() 会为 Nullable(T) 参数返回一个普通的基础类型。就我而言,“int?operatorId”返回“System.Int32”,我希望它是 Nullable(int)。

4

1 回答 1

2

您可以检查 Nullable 类型如下

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

Nullable.GetUnderlyingTypenull如果不是Nullable类型,将返回。

通常我们可以检查可空类型如下

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 中解释如下

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

于 2013-08-27T02:09:28.300 回答