Как проверить программно, если тип является структурой или классом?

Нестандартные вещи являются всегда странными:)

для долгой долгой части под GNU это L, ll или q

, и под окнами я полагаю, что это ll [только 116]

47
задан Cœur 15 April 2017 в 18:53
поделиться

3 ответа

Использовать Type.IsValueType :

Возвращает значение, указывающее, является ли Type типом значения.

Используйте его так:

typeof(Foo).IsValueType

или во время выполнения, например:

fooInstance.GetType().IsValueType

И наоборот, есть также свойство Type.IsClass (которое должно было называться IsReferenceType , на мой взгляд, но неважно), которое может или не может быть более подходящим для ваших целей в зависимости от того, что вы тестируете.

Кажется, что код всегда лучше читается без логических отрицаний, поэтому используйте то, что помогает читаемости вашего кода.


Как Стефан указывает ниже, для правильной идентификации структур вы должны быть осторожны, чтобы избежать ложные срабатывания, когда речь идет о перечислениях . Перечисление является типом значения, поэтому свойство IsValueType возвращает true для перечислений , а также структур .

Итак, если вы действительно ищете структуры , а не просто типы значений в целом, вам нужно будет сделать следующее:

Type fooType = fooInstance.GetType();
Boolean isStruct = fooType.IsValueType && !fooType.IsEnum;
76
ответ дан 26 November 2019 в 19:27
поделиться
Type type = typeof(Foo);

bool isStruct = type.IsValueType && !type.IsPrimitive;
bool isClass = type.IsClass;

Это все еще может быть: примитивный тип или интерфейс.


Изменить: Существует много дискуссий по поводу определения структуры. На самом деле структура и тип значения одинаковы, поэтому IsValueType - правильный ответ. Обычно мне приходилось знать, является ли тип определяемой пользователем структурой , то есть типом, который реализуется с использованием ключевого слова struct , а не примитивным типом. Поэтому я сохраняю свой ответ для всех, у кого такая же проблема, как и у меня.


Редактировать 2 : Согласно Справочнику по C # , перечисления не являются структурами, в то время как любой другой тип значений. Следовательно, правильный ответ, как определить, является ли тип структурой:

bool isStruct = type.IsValueType && !type.IsEnum;

ИМХО, определение структуры больше запутывает, чем логично. Я действительно сомневаюсь, что это определение имеет какое-либо отношение к практике.

30
ответ дан 26 November 2019 в 19:27
поделиться

Попробуйте следующее

bool IsStruct(Type t) {
  return t.IsValueType;
}
1
ответ дан 26 November 2019 в 19:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: