Próbowałem dzisiaj zrobić kilka testów konwencji i uzyskać wszystkie typy w zestawie (przez wywołanie Assembly.GetTypes()
), gdy natknąłem się na coś:
System.RuntimeType:[First.Namespace.FirstClass]
Ilekroć próbuję porównać ten typ z typeof(FirstClass)
, nie są one równe. Tak więc, kiedy próbuję znaleźć wszystkie typy, które zawierają FirstClass
jako parametr ogólny, nie znajduję żadnego.
Jaka jest różnica między System.RuntimeType
i System.Type
?
Czy jest jakiś sposób na rozwiązanie mojego problemu?
c#
reflection
Edgar Gonzalez
źródło
źródło
Odpowiedzi:
System.RuntimeType
jest konkretną klasą wywodzącą się z abstrakcyjnej klasy bazowejSystem.Type
. PonieważSystem.RuntimeType
nie jest publiczny, zazwyczaj napotkasz jego wystąpienia jakoSystem.Type
.Nieporozumienie może powstać, gdy próbujesz uzyskać typ obiektu i omyłkowo wywołujesz
GetType()
inny obiekt reprezentujący typ pierwszego obiektu, zamiast po prostu używać tego obiektu bezpośrednio. NastępnieType.ToString()
zwróci,"System.RuntimeType"
gdy wywoływany obiekt reprezentuje Type:string str = string.Empty; Type strType = str.GetType(); Type strTypeType = strType.GetType(); strType.ToString(); // returns "System.string" strTypeType.ToString(); // returns "System.RuntimeType"
Na przykład w tym poście na blogu ktoś próbuje uzyskać typ kolumny w bazie danych, robiąc coś takiego:
object val = reader.GetFieldType(index); Type runtimeType = val.GetType(); PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); Type type = (Type)propInfo.GetValue(val, null);
Ponieważ val jest już obiektem Type, val.GetType () zwróci inny obiekt Type reprezentujący typ,
System.RuntimeTime
ponieważ jest to konkretny typ używany do reprezentowania pierwotnego obiektu typu. W poście na blogu pokazano następnie niepotrzebną sztuczkę refleksji, aby uzyskać typ obiektu typu oryginalnego, podczas gdy tak naprawdę wszystko, co było wymagane, to:Type type = reader.GetFieldType(index) as Type;
Więc jeśli twój
Type
obiekt zgłasza, że reprezentuje aSystem.RuntimeType
, upewnij się, że nie wywołałeś przypadkowoGetType()
typu, który już masz.źródło
Type
zwróci wartość true, nawet jeśli zdasztypeof(int)
. Drugi fragment kodu nie działa w przypadku porównywaniatypeof(string).GetType()
itypeof(Type)
.Od odpowiedzi do Różnica między System.Type i System.RuntimeType autorstwa Thomasa Daneckera :
źródło
W skrócie...
"".GetType().ToString() == "System.String" "".GetType().GetType().ToString() == "System.RuntimeType"
Sposób, w jaki teraz o tym myślę, jest taki, że
System.Type
jest to typ podstawowy dla typu, który reprezentuje wyniki żądania typu obiektu w czasie wykonywania, a mianowicieSystem.RuntimeType
. Więc, kiedy zażądać od rodzaju obiektu, jak w,"".GetType()
, wystąpienieSystem.Type
zwrócony jest jego potomkiem,System.RuntimeType
. W rzeczywistości, należy spodziewać się, żetypeof(System.Type).GetType()
powinno byćSystem.RuntimeType
tak dobrze, ale myślę, że ramy specjalnie zapobiega to ... symetrię.źródło
Spójrz na tego bloga, facet mówi o różnicy. Wygląda mi na to, że te klasy są wynikiem optymalizacji .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx
źródło