Как узнать, что параметр является массивом? - PullRequest
2 голосов
/ 30 июня 2010

Я работаю с отражением, и когда я получаю список параметров метода, мне нужно изучить все из них, когда я найду любой, его тип - массив , которого мне нужно избегать это я имею в виду массив любого типа , поэтому я использовал следующее, что не работает:

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

Ошибка была в том, что я использую тип в качестве переменной !! Что я могу сделать, чтобы сделать это, какие-либо предложения ??

Ответы [ 3 ]

5 голосов
/ 30 июня 2010

Попробуйте

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

ПРИМЕЧАНИЕ - от MSDN:

Свойство IsArray возвращает false для класс Array.

Чтобы проверить массив, используйте такой код как TypeOf (Array) .IsAssignableFrom (тип).

Если текущий Тип представляет универсальный тип или параметр типа в определение универсального типа или универсальный метод, это свойство всегда возвращает false.

Это означает, что если у вас есть простые объявления массива, такие как int [], string [] и т. Д., То IsArray хорошо, но если нет, вам придется использовать IsAssignableFrom().

1 голос
/ 30 июня 2010

Вы , используя тип ('Array') в качестве переменной.Существует разница между переменной типа «System.Type» (представляет тип) и фактическим типом.Чтобы преобразовать тип в System.Type, вы используете typeof (type).

Теперь вам нужны не все объекты типа Array, а те объекты, которые могут быть назначены объекту типаМассив (т.е. Массив или его потомки).Это немного задом наперед, но способ сделать это - посмотреть, можно ли назначить System.Type для массива из System.Type для типа вашей переменной.

Итак, в качестве общего шаблона вы хотите попробовать что-то вродеthis:

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

Однако, как показывает другой ответ, System.Type имеет свойство IsArray, которое пропускает это для вас, если вы имеете дело с реальным массивом (int [], bool [] и т.д..), а не пользовательский потомок Array (например, что-то вроде CustomArrayClass: Array).

0 голосов
/ 30 июня 2010

Поскольку я использую параметры, я не должен использовать «GetType», например:

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

Это работает только для назначенных объектов, с параметрами это вернет тип parameterInfo .

Для параметров следует использовать «ParameterType», и ответ будет выглядеть следующим образом:

( !(typeof(Array).IsAssignableFrom(parameter.ParameterType)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...