Единственный способ безопасно проверить, является ли тип частью сборки, - это проверить полное имя сборки, которое содержит ее имя, версию, культуру и открытый ключ (если подписано). Все библиотеки базовых классов .Net (BCL) подписаны Microsoft с использованием своих закрытых ключей. Это делает практически невозможным для кого-либо еще создание сборки с таким же полным именем, как у библиотеки базовых классов.
//add more .Net BCL names as necessary
var systemNames = new HashSet<string>
{
"mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089",
"System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
};
var isSystemType = systemNames.Contains(objToTest.GetType().Assembly.FullName);
Несколько менее хрупкое решение - использовать класс AssemblyName и пропустить проверку номера версии / культуры. Это, конечно, предполагает, что открытый ключ не меняется между версиями.
//add more .Net BCL names as necessary
var systemNames = new List<AssemblyName>
{
new AssemblyName ("mscorlib, Version=4.0.0.0, Culture=neutral, " +
"PublicKeyToken=b77a5c561934e089"),
new AssemblyName ("System.Core, Version=4.0.0.0, Culture=neutral, "+
"PublicKeyToken=b77a5c561934e089")
};
var obj = GetObjectToTest();
var objAN = new AssemblyName(obj.GetType().Assembly.FullName);
bool isSystemType = systemNames.Any(
n => n.Name == objAN.Name
&& n.GetPublicKeyToken().SequenceEqual(objAN.GetPublicKeyToken()));
Большинство BCL были подписаны тем же ключом, но не всеми. Вы можете использовать класс AssemblyName, чтобы просто проверить токен открытого ключа. Это зависит от ваших потребностей.