Откуда придут сторонние типы? Возможно, вы захотите провести различие между типами, которые, как утверждают, предоставляются Microsoft, и типами, которые этого не делают.
using System;
using System.Linq;
using System.Reflection;
class Test
{
static void Main()
{
Console.WriteLine(IsMicrosoftType(typeof(string)));
Console.WriteLine(IsMicrosoftType(typeof(Test)));
}
static bool IsMicrosoftType(Type type)
{
object[] attrs = type.Assembly.GetCustomAttributes
(typeof(AssemblyCompanyAttribute), false);
return attrs.OfType<AssemblyCompanyAttribute>()
.Any(attr => attr.Company == "Microsoft Corporation");
}
}
Конечно, любой тип может утверждать, что будет принадлежать Microsoft по данной схеме, но если вы на самом деле собираетесь вызывать его только для своих собственных типов и структур, я подозреваю, что это должно работать нормально .
Кроме того, вы можете использовать токен открытого ключа сборки. Это, вероятно, будет сложнее подделать. Он полагается на то, что Microsoft использует общий открытый ключ для всех своих сборок, чего они не делают (согласно комментарию Мехрдада ниже). Однако вы можете легко адаптировать это решение для набора принятых открытых ключей «это от Microsoft». Возможно, как-то объединить два подхода и сообщить о любых различиях для дальнейшей проверки ...
static bool IsMicrosoftType(Type type)
{
AssemblyName name = type.Assembly.GetName();
byte[] publicKeyToken = name.GetPublicKeyToken();
return publicKeyToken != null
&& publicKeyToken.Length == 8
&& publicKeyToken[0] == 0xb7
&& publicKeyToken[1] == 0x7a
&& publicKeyToken[2] == 0x5c
&& publicKeyToken[3] == 0x56
&& publicKeyToken[4] == 0x19
&& publicKeyToken[5] == 0x34
&& publicKeyToken[6] == 0xe0
&& publicKeyToken[7] == 0x89;
}