В чем разница между системой.Тип и система.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