Подтвердить что ты не робот

Почему я не могу индексировать в ExpandoObject?

Что-то меня застало врасплох при изучении динамики С# сегодня (я их никогда не использовал, но в последнее время я экспериментировал с веб-картой Nancy). Я обнаружил, что не могу этого сделать:

dynamic expando = new ExpandoObject();

expando.name = "John";

Console.WriteLine(expando["name"]);

Последняя строка генерирует исключение:

Невозможно применить индексирование с [] к выражению типа 'System.Dynamic.ExpandoObject'

Я понимаю сообщение об ошибке, но я не понимаю, почему это происходит. Я просмотрел документацию для ExpandoObject и явно реализует IDictionary<,> и, следовательно, имеет метод this.[index] (MSDN). Почему я не могу назвать это?

Конечно, мне нечего мешать спускать ExpandoObject на словарь вручную, а затем индексировать в него, но это не соответствует точке; он также не объясняет, как Expando смог скрыть метод одного из своих интерфейсов.

Что здесь происходит?

4b9b3361

Ответ 1

как Expando смог скрыть метод одного из своих интерфейсов.

Поскольку, как вы правильно узнали в документации, indexer - это явная реализация интерфейса. Из Учебника по явному внедрению интерфейса:

Класс, реализующий интерфейс, может явно реализовать элемент этого интерфейса. Когда элемент явно реализован, к нему нельзя получить доступ через экземпляр класса, но только через экземпляр интерфейса.

Это означает, что вам нужно будет указать ссылку на интерфейс для доступа к ней:

((IDictionary<String, Object>)expando)["name"]