В чем разница между системой.Тип и система.RuntimeType в C#?


Я пытался сделать некоторые тесты конвенции сегодня, и получить все типы в сборке (позвонив Assembly.GetTypes()), когда я наткнулся на что-то:

System.RuntimeType:[First.Namespace.FirstClass]

всякий раз, когда я пытаюсь сравнить этот тип с typeof(FirstClass), они не равны. Поэтому, когда я пытаюсь найти все типы, которые содержат FirstClass как общий параметр, я не нахожу ни одного.

в чем разница между System.RuntimeType и System.Type?

есть ли способ решить мою проблему?

4 67

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