Как добавить T в List <T>, где List <T>маскируется как «динамический», а T как «объект»? - PullRequest
6 голосов
/ 18 января 2012

Как мне изменить этот фрагмент, чтобы правильно добавить экземпляр A в List<A>, B в List<B> и т. Д .?

// someChild's actual type is A
object someChild = GetObject();
// collection's actual type is List<A> though method below returns object
dynamic list = GetListFromSomewhere(...);
// code below throws a RuntimeBinderException
list.Add(somechild);

Исключение выдаетсяпоскольку, хотя связыватель обнаруживает Add(), он переходит в dynamic, что не позволяет разрешить перегрузку.Я предпочитаю , а не , чтобы изменить вышеприведенное, чтобы использовать отражение, или, по крайней мере, минимизировать это.У меня есть доступ к экземпляру System.Type для каждого из A и List<A>.Класс или метод, содержащий приведенный выше код, сам по себе не является универсальным.

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Все, что вам нужно, это также сделать динамическую привязку для аргумента - поэтому вам просто нужно, чтобы тип someChild был dynamic:

dynamic someChild = GetObject();
dynamic list = GetListFromSomewhere(...);
list.Add(somechild);

В вашем предыдущем коде компилятор запомнил , что тип времени компиляции someChild был object, и поэтому использовал этот тип времени компиляции вместо типа времени выполнения. Средство привязки времени выполнения умно обрабатывает только динамические выражения для разрешения перегрузки.

1 голос
/ 18 января 2012

Джон прав, поэтому я принял это, но есть и моя собственная забывчивость, которую List<T> реализует IList (неуниверсальная версия):

object someChild = GetObject();
var list = (IList)GetListFromSomewhere(...);
list.Add(somechild);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...