如何知道参数是一个数组?

时间:2010-06-30 01:11:20

标签: c# winforms reflection

我正在使用反射,当我获得参数的方法列表时,我需要检查所有这些,当我找到任何一个类型为数组时我需要避免它,我的意思是任何类型,所以我使用了以下不起作用:

(!(parameter.GetType().Equals(Array)))

错误是我使用类型作为变量!我能做些什么来做任何建议?

3 个答案:

答案 0 :(得分:5)

尝试

(!(parameter.GetType().IsArray))

注意 - 来自MSDN:

  

IsArray属性为false返回false   Array类。

     

要检查数组,请使用此类代码   如   typeof运算(阵列).IsAssignableFrom(类型)。

     

如果当前的Type代表a   泛型类型或类型参数   泛型类型的定义   泛型方法,这个属性总是如此   返回false。

这意味着如果您有简单的数组声明,如int [],string []等等,IsArray就可以了,但如果没有,那么您将不得不使用IsAssignableFrom()

答案 1 :(得分:1)

使用类型('Array')作为变量。 “System.Type”类型的变量(表示类型)与实际类型之间存在差异。要将类型转换为System.Type,请使用typeof(type)。

现在,您不希望所有类型为Array的内容,而是那些可以分配给类型为Array的对象(即Array或其后代)的对象。这有点向后但是这样做的方法是查看System.Type for Array是否可以从System.Type为您的变量类型分配。

所以,作为一般模式,你想尝试这样的事情:

( !(typeof(Array).IsAssignableFrom(parameter.GetType())) )

但是,正如另一个答案所示,System.Type有一个IsArray属性可以为你跳过这个,只要你处理一个实际的数组(int [],bool []等)而不是自定义数组后代(例如CustomArrayClass:Array之类的东西)。

答案 2 :(得分:0)

当我使用参数时,我不应该使用“GetType”,如下所示:

( !(typeof(Array).IsAssignableFrom(parameter.GetType())) )

这仅适用于已分配的对象,参数将返回 parameterInfo 类型。

对于参数,应使用“ParameterType”,答案如下所示:

( !(typeof(Array).IsAssignableFrom(parameter.ParameterType)))