Вопрос в том, почему он сохраняется при возврате?
Поскольку приведение не меняет объект . Это просто меняет то, как вы просматриваете объект.
Думайте об этом, как о человеке. У вас могут быть разные способы просмотра вас:
- Коллега
- Управляющий
- Член семьи
- друг
Они только "видят" определенные аспекты вас, но это не меняет того, кто вы есть.
Аналогично, простое преобразование ссылок не меняет объект. Если вы позвоните user.GetType()
, он все равно сообщит о фактическом типе объекта. Просто, когда вы просматриваете объект через определенный объектив (будь то интерфейс или базовый класс), вы видите только те элементы, которые вам показывает объектив.
(Обратите внимание, что приведение, которое вызывает пользовательское преобразование, например приведение от XElement
к string
, совершенно другое. Оно возвращает ссылку на новый объект, а не только на существующий объект в другом способ.)
Если вы хотите видеть только свойства IUser
, используйте typeof(IUser).GetProperties()
вместо вызова GetType()
сначала:
private static void Outputter(IUser user)
{
foreach (var prop in typeof(IUser).GetProperties())
{
Console.WriteLine($"{prop.Name}: {prop.GetValue(user)}");
}
}
Хотя я не уверен, что в большинстве случаев это особенно полезно делать с отражением.