La única manera segura compruebe si un tipo es parte de un ensamblaje para verificar el nombre completo del ensamblado que contiene su nombre, versión, cultura y clave pública (si está firmado). Todas las bibliotecas de clase base .Net (BCL) están firmadas por microsoft usando sus claves privadas. Esto hace que sea casi imposible para cualquier otra persona crear un ensamblado con el mismo nombre totalmente calificado que una biblioteca de clase base.
//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);
una solución ligeramente menos frágil es el uso de la clase AssemblyName y omitir la comprobación de número de versión/cultura. Por supuesto, esto supone que la clave pública no cambia entre las versiones.
//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()));
La mayor parte del BCL se ha firmado con la misma clave, pero no con todas. Puede usar la clase AssemblyName para simplemente verificar el token de clave pública. Depende de tus necesidades.
¿Por qué te importa? –