Распечатайте переменную на экране с помощью Razor (C#)

Я хочу вывести переменную на экран с помощью Razor. У меня есть класс с именем CustomPrincipal, сохраненный в HttpContext, который сохраняется правильно.

Я хочу, чтобы это было в одной строке, как в примере ниже, который, к сожалению, не работает:

@* This is not working... *@
@(CustomPrincipal)Context.Items["IUser"].Name

Однако приведенный ниже пример работает, поэтому он правильно сохранил его в HttpContext.

@{ CustomPrincipal user = (CustomPrincipal)Context.Items["IUser"]; }
@user.Name

Кто-нибудь знает, почему первый пример не работает, и можете ли вы показать мне решение?

Ошибка:

Сообщение об ошибке компилятора: CS0118: «CustomPrincipal» является «типом», но используется как «переменная».


person Yanick van Barneveld    schedule 21.09.2016    source источник
comment
Что вы имеете в виду под не работает? У вас есть сообщение об ошибке? Ничего не отображается?   -  person DavidG    schedule 21.09.2016
comment
Прочтите Как спросить, уточните, что не работает, и поделитесь своим исследованием. Это проблема со скобками, вы не можете преобразовать строку Name в CustomPrincipal.   -  person CodeCaster    schedule 21.09.2016
comment
Вероятно, вам просто нужно заключить объект CustomPrincipal в скобки, иначе он попытается привести всю строку к этому типу: @(((CustomPrincipal)Context.Items["IUser"]).Name)   -  person DavidG    schedule 21.09.2016
comment
@DavidG Это тоже не работает, тогда он просто выводит на экран строку CustomPrincipal.Name.   -  person Yanick van Barneveld    schedule 21.09.2016
comment
@DavidG еще один набор скобок. Формат @(...) будет печатать только ..., так что вы можете добавлять и добавлять текст, который может выглядеть как код C#.   -  person CodeCaster    schedule 21.09.2016
comment
@CodeCaster Конечно, хорошее место.   -  person DavidG    schedule 21.09.2016
comment
@YanickvanBarneveld Попробуйте еще раз   -  person DavidG    schedule 21.09.2016
comment
Спасибо! Это помогло: @(((CustomPrincipal)Context.Items[IUser]).Name). Забыл последний набор скобок.   -  person Yanick van Barneveld    schedule 21.09.2016


Ответы (1)


Все кредиты принадлежат @DavidG и @CodeCaster, упомянутым в комментариях.

@(((CustomPrincipal)Context.Items["IUser"]).Name)

Круглые скобки там, где это необходимо, потому что в противном случае нет свойства Name для типа Object, которым является Context.Items["IUser"]. Мы должны добавить круглые скобки, чтобы сначала привести Object к CustomPrincipal, а затем получить доступ к свойству Name этого типа.

Другой пример той же проблемы: https://stackoverflow.com/a/4151988/4585226

person 476rick    schedule 29.09.2016
comment
Первый пример в вопросе не работает, потому что он пытается привести свойство Name типа Object Context.Items["IUser"] к типу CustomPrincipal, по крайней мере, это то, что интерпретируется. Ваш пример работает, потому что он сначала приводит Object к CustomPrincipal, а затем обращается к свойству Name типа CustomPrincipal. - person Zack; 29.09.2016