2013-02-14 4 views
-1

Ищет способ получить основные/основные типы в C# без с использованием IsPrimitive и связкой «||». В принципе, я хочу включить десятичную, datetime, строку, но я не хочу специально искать их.Отражение приобретает фундаментальные типы

Я помню, что видел что-то, что могло проверить основной тип объекта, и посмотреть, наследует ли он от объекта.

Может кто-нибудь указать мне в правильном направлении, как это сделать?

Также как этот метод классифицирует примитивные значения nullables?

+5

Что такое «фундаментальный» тип для вас? Набор типов, которые считаются «примитивами» в .NET, конечен; просто настройте «HashSet » и проверьте наличие содержимого? Не существует свойства 'IsFundamental'. – dtb

+0

«Примитивные nullables» - это экземпляры общей структуры 'Nullable ', где T является примитивным типом. (Или тип бокса, соответствующий примитивному типу, не уверен.) – millimoose

+0

Не могли бы вы объяснить, почему вы хотите это знать? – svick

ответ

2

Если вы хотите получить список всех основных типов данных (которые не являются основополагающими для начала, они просто ведут себя по-другому по сравнению с другими структурами), вам нужно будет использовать IsPrimitive. Я понял, что не хочу использовать ||, но IsPrimitive имеет для меня большой смысл.

Кроме того, DateTime не имеет веских оснований считать фундаментальным/примитивным. DateTime - это просто ваша регулярная структура.

Вот лучший метод, который я мог придумать:

List<Type> types = typeof(string).Assembly.GetTypes() 
        .Where(t => t.IsPrimitive).ToList(); 
types.Add(typeof(string)); 
types.Add(typeof(decimal)); 

Это будет искать mscorlib (typeof(string).Assembly) для любых типов, и выбирает только примитивы (System.DateTime не в списке, но вы можете добавить если хотите). Типы string и decimal включены, поскольку они могут считаться фундаментальными.

+0

'струна' специальный. Он не ведет себя как любой другой класс. Например, вы можете иметь строковые константы, это один из немногих (тип массива и строки), которые имеют в виду типы переменных. – CodesInChaos

+0

Итак, вы считаете «IntPtr», который особым образом обрабатывается .NET, но не C#, «фундаментальный». И вы также рассматриваете 'decimal', который особым образом обрабатывается C#, но не .Net. Означает ли это, что, по вашему мнению, набор «фундаментальных» типов - это объединение между «типами с ключевыми словами в C#» и «примитивными типами в .Net»? – svick

+0

@svick Вот почему мне было трудно ответить на вопрос в первую очередь. Просто нет хорошего определения, когда дело доходит до основных типов данных в C# _or_ .NET. Поэтому всегда будет субъективный фактор. – antonijn

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