Eu estava tentando fazer alguns testes de convenção hoje, e obtendo todos os tipos em um assembly (por chamada Assembly.GetTypes()
), quando tropecei em algo:
System.RuntimeType:[First.Namespace.FirstClass]
Sempre que tento comparar esse tipo com typeof(FirstClass)
, eles não são iguais. Então, quando tento encontrar todos os tipos que contêm FirstClass
um parâmetro genérico, não estou encontrando nenhum.
Qual é a diferença entre System.RuntimeType
e System.Type
?
Existe alguma maneira de resolver meu problema?
c#
reflection
Edgar Gonzalez
fonte
fonte
Respostas:
System.RuntimeType
é uma classe concreta que deriva da classe base abstrataSystem.Type
. ComoSystem.RuntimeType
não é público, você normalmente encontrará instâncias dele comoSystem.Type
.Pode surgir confusão quando você está tentando obter o tipo de um objeto e, por engano, chamar
GetType()
outro objeto que representa o tipo do primeiro objeto, em vez de apenas usar esse objeto diretamente. Em seguidaType.ToString()
, retornará"System.RuntimeType"
quando o objeto em que é chamado estiver representando um Tipo:string str = string.Empty; Type strType = str.GetType(); Type strTypeType = strType.GetType(); strType.ToString(); // returns "System.string" strTypeType.ToString(); // returns "System.RuntimeType"
Por exemplo, nesta postagem do blog, alguém está tentando obter o tipo de uma coluna em um banco de dados, fazendo algo assim:
object val = reader.GetFieldType(index); Type runtimeType = val.GetType(); PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); Type type = (Type)propInfo.GetValue(val, null);
Visto que val já é um objeto Type, val.GetType () retornará outro objeto Type que representa o tipo,
System.RuntimeTime
pois esse é o tipo concreto usado para representar o objeto de tipo original. A postagem do blog mostra alguns truques de reflexão desnecessários, para obter o tipo do objeto de tipo original, quando na verdade tudo o que era necessário era:Type type = reader.GetFieldType(index) as Type;
Portanto, se o seu
Type
objeto estiver relatando que representa umSystem.RuntimeType
, certifique-se de não ter chamado acidentalmenteGetType()
um tipo que já obteve.fonte
Type
ele retornará verdadeiro mesmo se você passartypeof(int)
. O segundo trecho de código não funciona para comparartypeof(string).GetType()
etypeof(Type)
.Da resposta para Different between System.Type and System.RuntimeType de Thomas Danecker :
fonte
Em resumo...
"".GetType().ToString() == "System.String" "".GetType().GetType().ToString() == "System.RuntimeType"
A maneira como penso agora é que
System.Type
é um tipo base para o tipo que representa os resultados da solicitação do tipo de objeto em tempo de execução, a saberSystem.RuntimeType
. Portanto, quando você solicita o tipo de um objeto, como em"".GetType()
,, a instância deSystem.Type
retornado é seu descendenteSystem.RuntimeType
,. Na verdade, deve-se esperar que otypeof(System.Type).GetType()
também sejaSystem.RuntimeType
, mas acho que a estrutura evita especificamente isso ... simetria.fonte
Dê uma olhada nesse blog, o cara fala sobre a diferença. Parece-me que essas classes são o resultado da otimização do .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
fonte