Как определить, является ли тип объекта встроенным типом системы - PullRequest
37 голосов
/ 09 мая 2011

Я пишу простой List<t> в CSV конвертер.Мой конвертер проверяет все t в Списке и захватывает все общедоступные свойства и помещает их в CSV.

Мой код прекрасно работает (как и предполагалось), когда вы будете использовать простой класс с несколькими свойствами.

Я хотел бы получить преобразователь List<t> в CSV, чтобы он также принимал типы систем, такие как String и Integer.С этими типами систем я не хочу получать их общедоступные свойства (такие как длина, символы и т. Д.).Таким образом, я хотел бы проверить, является ли объект системным типом.Под типом системы я подразумеваю один из встроенных типов .Net, таких как string, int32, double и т. Д.

Используя GetType (), я могу найти следующее:

string myName = "Joe Doe";

bool isPrimitive = myName.GetType().IsPrimitive; // False
bool isSealed = myName.GetType().IsSealed; // True 
// From memory all of the System types are sealed.
bool isValueType = myName.GetType().IsValueType; // False

// LinqPad users: isPrimitive.Dump();isSealed.Dump();isValueType.Dump();

Как найтиесли переменная myName является встроенной системой типа?(при условии, что мы не знаем его строку)

Ответы [ 6 ]

52 голосов
/ 09 мая 2011

Вот несколько вариантов:

  • myName.GetType().Namespace == "System"
  • myName.GetType().Namespace.StartsWith("System")
  • myName.GetType().Module.ScopeName == "CommonLanguageRuntimeLibrary"
39 голосов
/ 09 мая 2011

myName.GetType().Namespace
Это вернет System, если это встроенный тип.

10 голосов
/ 10 июня 2013

Если вы не можете точно определить, что такое «встроенный тип системы», тогда, вероятно, вы не будете знать, какие типы содержатся в любом ответе. Более вероятно, что вы хотите сделать, это просто список типов, с которыми вы не хотите делать это. Иметь метод IsSimpleType, который просто проверяет различные типы.

Другая вещь, которую вы можете искать, это Примитивные типы. Если так, посмотрите на:

Type.IsPrimitive (http://msdn.microsoft.com/en-us/library/system.type.isprimitive.aspx)

Примитивные типы: логические, байтовые, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double и Single.

Сюда не входит строка, но вы можете добавить ее вручную ...

См. Также Как проверить, является ли тип примитивным

5 голосов
/ 10 июня 2013

Я думаю, что это лучшая возможность:

private static bool IsBulitinType(Type type)
{
    return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object);
}
4 голосов
/ 21 июня 2017

Методы на основе пространства имен потенциально могут вызывать коллизии.

Существует еще один надежный и простой способ:

static bool IsSystemType(this Type type) => type.Assembly == typeof(object).Assembly;

Или чуть более оптимально

static readonly Assembly SystemAssembly == typeof(object).Assembly;

static bool IsSystemType(this Type type) => type.Assembly == SystemAssembly;
3 голосов
/ 17 февраля 2015

Я размышлял над чем-то и обнаружил, что свойство IsSecurityCritical , казалось, работает для этой цели; однако, это было только потому, что уровень доверия для моей сборки был недостаточно высок, чтобы перевернуть этот бит.

Немного смеха; К счастью, я нашел этот вопрос и буду корректировать его соответствующим образом.

Примечание : свойство IsSecurityCritical существует, только если .NetFramework> 4

Я, вероятно, пойду с; следующее из предыдущего ответа.

myName.GetType (). Module.ScopeName == "CommonLanguageRuntimeLibrary"

Но, с парой твиков; например, сделать его методом расширения для Type и использовать const для CommonLanguageRuntimeLibrary

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...