2014-09-12 2 views
2

У меня есть коллекция типов, и я хочу отфильтровать каждый тип, который не является конкретным.C# - Как я могу проверить, является ли тип конкретным?

Я могу видеть, что я могу проверить isAbstract и isInterface, чтобы поймать большинство неконкретных, но разве это что-то упустит?

Есть ли свойство «isConcrete»?

+2

Все, что не является абстрактным или интерфейс конкретен. Это не означает, что вы можете обязательно создать экземпляр, –

+1

'IsAbstract' также улавливает интерфейсы –

ответ

5

Я полагаю, что если вы дадите IsClass && !IsAbstract, попробуйте это может работать?

if isConcreteType(myType) { DoSomething(); } 

bool isConcreteType(Type type) { 
    return type.IsClass && !type.IsAbstract && !type.IsInterface; 
} 

Согласно комментарий по KC-NH:

Структуры типы значений и так IsClass будет ложным. Вы хотите, чтобы структуры считались конкретными классами? Если это так, удалите условию IsClass

Так что, если вы хотите, чтобы рассмотреть struct конкретный тип, вы должны отмахиваться на IsClass ограничение.

bool isConcreteType(Type type) { return !type.IsAbstract && !type.IsInterfaces; } 
+0

Структуры являются типами значений, поэтому IsClass будет ложным. Вы хотите, чтобы структуры считались конкретными классами? Если это так, удалите условие IsClass. –

2

Противоположность IsAbstract является «конкретно», так что вы хорошо с этими проверками

+0

Может быть интерфейс. – Haney

+2

@Haney: 'IsAbstract' возвращает' true' для интерфейсов тоже, я думаю. –

+0

@AndrewWhitaker Я думаю, что ты прав. Просто протестировал его на 'System.Collections.IEnumerable' и был' true' – Haney

Смежные вопросы