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 уже является объектом Type, val.GetType () вернет другой объект Type, представляющий тип System.RuntimeTime
, так как это конкретный тип, используемый для представления объекта исходного типа. Затем в сообщении блога показаны некоторые ненужные трюки с отражением, чтобы получить тип исходного объекта типа, когда на самом деле все, что требовалось, было:
Type type = reader.GetFieldType(index) as Type;
Поэтому, если ваш Type
объект сообщает, что он представляет System.RuntimeType
, убедитесь, что вы случайно не вызвали GetType()
для типа, который вы уже получили.