tag c# .net reflection types

tag - summary c# documentation



Cómo determinar si un tipo de objeto está integrado en un tipo de sistema (6)

Estoy escribiendo un simple List<t> al convertidor de CSV. Mi convertidor comprueba todas las t en List y toma todas las propiedades públicas y las coloca en el CSV.

Mi código funciona muy bien (como se pretendía) cuando utilizará una clase simple con algunas propiedades.

Me gustaría que el convertidor List<t> a CSV también acepte los tipos de sistema como String e Integer. Con estos tipos de sistema, no quiero obtener sus propiedades públicas (como Length, Chars, etc.). Por lo tanto, me gustaría verificar si el objeto es un tipo de sistema. Por tipo de sistema me refiero a uno de los tipos de .Net integrados como string, int32, double etc.

Usando GetType () puedo encontrar lo siguiente:

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();

¿Cómo puedo saber si la variable myName está integrada en el tipo de sistema? (suponiendo que no sepamos que es una cadena)


Aquí hay algunas de las varias posibilidades:

  • myName.GetType().Namespace == "System"
  • myName.GetType().Namespace.StartsWith("System")
  • myName.GetType().Module.ScopeName == "CommonLanguageRuntimeLibrary"

Creo que esta es la mejor posibilidad:

private static bool IsBulitinType(Type type) { return (type == typeof(object) || Type.GetTypeCode(type) != TypeCode.Object); }


Estaba construyendo algo reflexivamente y descubrí que la propiedad IsSecurityCritical parecía funcionar para este propósito; sin embargo, esto fue solo porque el nivel de confianza para mi ensamblaje no era lo suficientemente alto como para cambiar ese bit.

Un poco de risa; afortunadamente encontré esta pregunta y me ajustaré en consecuencia.

Nota : La propiedad IsSecurityCritical solo existe si .NetFramework> 4

Probablemente vaya con; lo siguiente de una respuesta anterior.

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

Pero, con un par de ajustes; como hacer que sea un método de extensión en Type y usar un const para CommonLanguageRuntimeLibrary


Los métodos basados ​​en el espacio de nombres pueden causar colisiones.

Hay otra manera confiable y simple:

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


Si no puede definir con precisión qué es un "tipo de sistema integrado", es probable que no sepa qué tipos hay en una respuesta dada. Lo más probable es que lo que quieras hacer sea tener una lista de los tipos con los que no quieres hacer esto. Tenga un método "IsSimpleType" que solo haga una comprobación contra varios tipos.

La otra cosa que puedes estar buscando es Tipos Primitivos. Si es así mira:

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

Los tipos primitivos son Boolean, Byte, SByte, Int16, UInt16, Int32, UInt32, Int64, UInt64, IntPtr, UIntPtr, Char, Double y Single.

Esto no incluye cadena, pero podrías agregarlo manualmente ...

Consulte también Cómo probar si el tipo es primitivo


myName.GetType().Namespace
Esto devolverá System si es un tipo incorporado.