Идея состоит в том, чтобы иметь возможность определить истинный тип объекта в параметре метода
Это достаточно просто (и вы уже делаете это).
Type actualType = param.GetType();
Это даст вам конкретный конкретный тип объекта
и затем приведите этот объект к типу true
Это то, где вещи немного сбиваются с рельсов. Оператор приведения в C # (использование которого люди называют «приведением») может делать две вещи:
- Используйте явные преобразования, специфичные для типа, для создания нового объекта путем применения преобразования к существующему объекту (обратите внимание, что это ссылка new , которая создается; тип исходного объекта никогда не изменяется)
- Разрешить разработчику ссылаться на объект как на тип, который находится на уровне иерархии наследования, отличном от того, который предоставляется в настоящее время (или интерфейс, который реализован для типа, который находится ниже в иерархии, чем тот, на который на данный момент ссылаются)
В вашем случае, первый вариант прямо; оператор приведения, как и все операторы, не является полиморфным. То есть оператор применяется только в том случае, если он определен для типа , на который ссылаются, а не для объекта , на который ссылаются. Если вы хотите получить дополнительные разъяснения по этому вопросу, дайте мне знать, но я не думаю, что это уместно для вашего вопроса, поэтому я не буду вдаваться в подробности, если вас не спросят.
Второй вариант - это единственный вариант, который может реально применяться к вам, но рассмотрим только две причины, по которым вы хотели бы сделать это:
- Так что вы можете ссылаться на объект как на конкретный конкретный тип, который находится на более низком уровне, чем в настоящее время предоставляется (в вашем случае, ваш объект -
object
, так что это довольно много, так как он идет)
- Чтобы вы могли ссылаться на объект как тип, который на выше в иерархии, чтобы вы могли обходить скрытые (но не переопределенные) члены.
(Подавляющее большинство приведений происходит по причине № 1)
Причина, по которой вы хотите использовать любой из этих параметров, заключается в том, что вы можете иметь строго типизированный объект и использовать различные члены, определенные для этого типа. Но все это относится только к типам, которые вы знаете , когда пишете код. Не имеет смысла приводить к типу, который неизвестен во время компиляции, так как приведение ничего не делает к реальному объекту (он является и должен оставаться его истинным типом; единственное, что изменяется, это тип переменная , по которой вы ссылаетесь на объект).
Если вы можете предоставить более подробный пример того, что вы на самом деле пытаетесь сделать (дополните его кодом, который вы хотели бы или ожидаете, что он будет работать), я мог бы предоставить что-то, смоделированное немного ближе. к тому, что вы хотите, но, как это описано, это настолько конкретно, насколько я могу получить.