Как я могу дифференцировать типы, которые я создал, к системным типам с отражением? - PullRequest
0 голосов
/ 23 февраля 2012

Я хотел бы знать, является ли тип, который я передаю, типом системы или типом, который я создал.Как я могу это знать?Посмотрите:

// Obs: currentEntity can be any entity that i created
var currentProperties = currentEntity.GetType().GetProperties();

foreach (var property in currentProperties)
{
    if (/* Verify here if the property is a system type */)
    {
         // Do what i want...
    }
}

Каков наилучший способ убедиться в этом?

OBS: считается "системным типом" всех типов базовой стандартной библиотеки в сборке, подписанной Microsoft как: DateTime, String, Int32, Boolean (все типы в mscorlib.dll | System.dll) ...

OBS2: Мои объекты не будут наследоваться от этих "типов системы".

OBS3Моя сущность может быть любого типа, который я создал, поэтому я не могу указать в сравнении.

OBS4: мне нужно сделать сравнение без указания, равен ли the String, Boolean ...

1 Ответ

7 голосов
/ 23 февраля 2012

Что считается "системным" типом?Вы можете проверить:

  • Это в mscorlib
  • Это в сборке, подписанной Microsoft
  • Это один из фиксированного набора типов, который вы считаете "системным""beforehand
  • Он находится в одном из фиксированных наборов сборок , которые вы заранее считаете" системными "
  • (Легко подделать) Его пространство имен System или начинаетсяс System.

Как только вы определили, что вы подразумеваете под «системой», это в значительной степени предлагает код, используемый для его проверки.Например:

  • if (type.Assembly == typeof(string).Assembly)
  • var publisher = typeof(string).Assembly.Evidence.GetHostEvidence<Publisher>(); - с последующей проверкой publisher, имеющего соответствующий сертификат для Microsoft
  • if (SystemTypes.Contains(type)) - один разу вас есть собственный список типов систем
  • if (SystemAssemblies.Contains(type.Assembly)) - как только вы создадите свой собственный список системных сборок (более практично)

РЕДАКТИРОВАТЬ:Согласно комментариям, если вы довольны только mscorlib и System.dll:

private static readonly ReadOnlyCollection<Assembly> SystemAssemblies = 
    new List<Assembly> {
        typeof(string).Assembly, // mscorlib.dll
        typeof(Process).Assembly, // System.dll
    }.AsReadOnly();

...

if (SystemAssemblies.Contains(type.Assembly))
{
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...