Почему я не могу индексировать в ExpandoObject?
Что-то меня застало врасплох при изучении динамики С# сегодня (я их никогда не использовал, но в последнее время я экспериментировал с веб-картой Nancy). Я обнаружил, что не могу этого сделать:
dynamic expando = new ExpandoObject();
expando.name = "John";
Console.WriteLine(expando["name"]);
Последняя строка генерирует исключение:
Невозможно применить индексирование с [] к выражению типа 'System.Dynamic.ExpandoObject'
Я понимаю сообщение об ошибке, но я не понимаю, почему это происходит. Я просмотрел документацию для ExpandoObject и явно реализует IDictionary<,>
и, следовательно, имеет метод this.[index]
(MSDN). Почему я не могу назвать это?
Конечно, мне нечего мешать спускать ExpandoObject
на словарь вручную, а затем индексировать в него, но это не соответствует точке; он также не объясняет, как Expando смог скрыть метод одного из своих интерфейсов.
Что здесь происходит?
Ответы
Ответ 1
как Expando смог скрыть метод одного из своих интерфейсов.
Поскольку, как вы правильно узнали в документации, indexer - это явная реализация интерфейса. Из Учебника по явному внедрению интерфейса:
Класс, реализующий интерфейс, может явно реализовать элемент этого интерфейса. Когда элемент явно реализован, к нему нельзя получить доступ через экземпляр класса, но только через экземпляр интерфейса.
Это означает, что вам нужно будет указать ссылку на интерфейс для доступа к ней:
((IDictionary<String, Object>)expando)["name"]