Estaba tratando de hacer algunas pruebas de convención hoy, y obteniendo todos los tipos en una asamblea (llamando Assembly.GetTypes()
), cuando tropecé con algo:
System.RuntimeType:[First.Namespace.FirstClass]
Siempre que trato de comparar ese tipo con typeof(FirstClass)
, no son iguales. Entonces, cuando trato de encontrar todos los tipos que contienen FirstClass
como parámetro genérico, no encuentro ninguno.
¿Cuál es la diferencia entre System.RuntimeType
y System.Type
?
¿Hay alguna forma de solucionar mi problema?
c#
reflection
Edgar González
fuente
fuente
Respuestas:
System.RuntimeType
es una clase concreta que se deriva de la clase base abstractaSystem.Type
. DadoSystem.RuntimeType
que no es público, normalmente encontrará instancias comoSystem.Type
.La confusión puede surgir cuando intenta obtener el tipo de un objeto y llama
GetType()
por error a otro objeto que representa el tipo del primer objeto, en lugar de usar ese objeto directamente. LuegoType.ToString()
regresará"System.RuntimeType"
cuando el objeto al que se llama esté representando un Tipo:string str = string.Empty; Type strType = str.GetType(); Type strTypeType = strType.GetType(); strType.ToString(); // returns "System.string" strTypeType.ToString(); // returns "System.RuntimeType"
Por ejemplo, en esta publicación de blog, alguien está tratando de obtener el tipo de columna en una base de datos, haciendo algo como esto:
object val = reader.GetFieldType(index); Type runtimeType = val.GetType(); PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); Type type = (Type)propInfo.GetValue(val, null);
Dado que val ya es un objeto Type, val.GetType () devolverá otro objeto Type que representa el tipo,
System.RuntimeTime
ya que este es el tipo concreto utilizado para representar el objeto tipo original. La publicación del blog luego muestra algunos trucos de reflexión innecesarios, para obtener el tipo de objeto de tipo original, cuando en realidad todo lo que se requería era:Type type = reader.GetFieldType(index) as Type;
Por lo tanto, si su
Type
objeto informa que representa aSystem.RuntimeType
, asegúrese de no haber llamado accidentalmenteGetType()
a un tipo que ya tiene.fuente
Type
; devolverá verdadero incluso si pasatypeof(int)
. El segundo fragmento de código no funciona para comparartypeof(string).GetType()
ytypeof(Type)
.De la respuesta a Diferente entre System.Type y System.RuntimeType de Thomas Danecker :
fuente
En breve...
"".GetType().ToString() == "System.String" "".GetType().GetType().ToString() == "System.RuntimeType"
La forma en que lo pienso ahora es que
System.Type
es un tipo base para el tipo que representa los resultados de la solicitud de tipo de objeto en tiempo de ejecución, es decirSystem.RuntimeType
. Por lo tanto, cuando se solicita el tipo de un objeto, como en,"".GetType()
, la instancia deSystem.Type
regresar es que es descendiente,System.RuntimeType
. De hecho, uno debería esperar que tambiéntypeof(System.Type).GetType()
lo seaSystem.RuntimeType
, pero creo que el marco previene específicamente esta ... simetría.fuente
Echa un vistazo a este blog, el chico habla de la diferencia. Me parece que estas clases son el resultado de la optimización de .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
fuente