TL; DR
Вы не можете привести что-либо к неизвестному типу, указанному во время выполнения.Это означало бы, что в вашем коде вы не знаете, каковы свойства или методы объекта, если вы не используете еще больше отражения.В таком случае какой смысл его использовать?
Иногда мы имеем дело с типами, которые не известны до времени выполнения.Но если тип действительно не имеет значения вообще, объект бесполезен, если мы не можем привести его к некоторому предопределенному типу, который указан в нашем коде, а не во время выполнения.
В этой строке кода:
var val = property.GetValue(obj);
объявленный тип val
выводится компилятором.Этот тип object
, потому что это тип, который возвращает GetValue
.Фактический тип объекта может быть string
, int
, List<Foo>
, как угодно.Но у вас есть переменная val
типа object
.
Если вы могли бы сделать это:
var val = property.GetValue(obj) as runtimeType;
Тогда что будет во время компиляциитипа val
быть?Как это может быть, поскольку runTimeType
является значением времени выполнения?Объект бесполезен, если вы не можете вызывать методы или проверять его свойства.Но вы не можете сделать это, не зная типа, если вы не используете больше отражения.Но если вы собираетесь это сделать, то нет смысла его приводить.
Где-то вниз по течению от опубликованного вами кода, вы, вероятно, захотите что-то сделать с объектом, который включает его методы или свойства.,Это означает, что вы знаете, какой тип вы думаете , и используете его как этот тип.Это будет тип, указанный в вашем коде, а не что-то определенное во время выполнения.
Например:
var val = property.GetValue(obj); // I know this is a string
var myString = (string)val;
var findX = myString.IndexOf("X");
Я думаю, что это string
, поэтому я приведу его как string
,(Там могут быть дополнительные проверки.) Теперь, когда я произвел это, у меня есть переменная, объявленная как тип string
, и я могу использовать ее как строку.(Если это не было string
- тогда это вызовет исключение во время выполнения.)
Это преимущество приведения - это позволяет нам назначать что-то строго типизированной переменной с типом, который мы определяем итогда используйте это соответственно.Приведение к неизвестному типу не принесло бы нам пользы.
С риском добавления путаницы: кто-то может сказать, что универсальные типы представляют типы, не указанные во время выполнения, но это не совсем так.List<T>
не указывает, что такое T
, но если вы создадите List<T>
, каким-то образом где-то вы будете указывать тип в своем коде.В подавляющем большинстве нормальных сценариев мы должны что-то знать о типе объекта, иначе этот объект для нас бесполезен.