В чем разница между системой.Тип и система.RuntimeType в C#?
Я пытался сделать некоторые тесты конвенции сегодня, и получить все типы в сборке (позвонив Assembly.GetTypes()), когда я наткнулся на что-то:
System.RuntimeType:[First.Namespace.FirstClass]
всякий раз, когда я пытаюсь сравнить этот тип с typeof(FirstClass), они не равны. Поэтому, когда я пытаюсь найти все типы, которые содержат FirstClass как общий параметр, я не нахожу ни одного.
в чем разница между System.RuntimeType и System.Type?
есть ли способ решить мою проблему?
4 ответа:
System.RuntimeType- это конкретный класс, производный от абстрактного базового классаSystem.Type. Так какSystem.RuntimeTypeне является публичным, вы, как правило, сталкиваются с экземплярами его какSystem.Type.путаница может возникнуть, когда вы пытаетесь получить тип объекта и ошибочно называют
GetType()на другой объект, представляющий тип первого объекта, а не просто использовать этот объект напрямую. ТогдаType.ToString()вернутся"System.RuntimeType"когда вызываемый объект представляет собой Тип:string str = string.Empty; Type strType = str.GetType(); Type strTypeType = strType.GetType(); strType.ToString(); // returns "System.string" strTypeType.ToString(); // returns "System.RuntimeType"например,этот блог кто-то пытается получить тип столбца в базе данных, делать что-то вроде этого:
object val = reader.GetFieldType(index); Type runtimeType = val.GetType(); PropertyInfo propInfo = runtimeType.GetProperty("UnderlyingSystemType"); Type type = (Type)propInfo.GetValue(val, null);так как val уже является объектом типа, val.GetType () вернет другой объект типа, представляющий тип
System.RuntimeTimeпоскольку это конкретный тип, используемый для представления объекта исходного типа. Затем сообщение в блоге показывает некоторые ненужные хитрости отражения, чтобы получить тип исходного объекта типа, когда действительно все, что требовалось было:Type type = reader.GetFieldType(index) as Type;так что если ваш
Typeобъект сообщает, что он представляет собойSystem.RuntimeTypeубедитесь, что вы не случайно называютGetType()типа у вас уже есть.
вкратце...
"".GetType().ToString() == "System.String" "".GetType().GetType().ToString() == "System.RuntimeType"то, как я сейчас думаю об этом, это
System.Typeявляется базовым типом для типа, который представляет результаты запроса типа объекта во время выполнения, а именноSystem.RuntimeType. Итак, когда вы запрашиваете тип объекта, например,"".GetType()экземплярSystem.Typeвозвращается это потомок,System.RuntimeType. На самом деле, следует ожидать, чтоtypeof(System.Type).GetType()должно бытьSystem.RuntimeTypeтакже, но я думаю, что рамки специально предотвращает это...симметрия.
взгляните на этот блог, парень говорит о разнице. Мне кажется, что эти классы являются результатом оптимизации .NET:
http://blogs.msdn.com/b/vancem/archive/2006/10/01/779503.aspx