Метод ToList недоступен для TrackableCollection - PullRequest
3 голосов
/ 12 июля 2011

Мы работаем с отслеживаемыми сущностями поверх EF 4.0.

Чтобы удалить сущность со всеми зависимыми сущностями, я пишу универсальный DeleteDependentEntities, который будет вызываться из метода Delete в EntityManager. (Мы не полагаемся или не хотим полагаться на CASCADE DELETE, который будет установлен для отношений в нашей базе данных.) DeleteDependentEntities сканирует рекурсивно все дочерние объекты подчиненного объекта Set.

Чтобы сделать его универсальным, чтобы его можно было использовать для всех сущностей в проекте, я использую динамические типы.

Метод заключается в следующем:

private void DeleteDependentEntities(dynamic entitySet, dynamic context)
{
  if (entitySet != null)
  {
    foreach (dynamic item in entitySet.ToList())
    {
      // 1. Scan object for children and delete children
      ProcessChildren(item, context);

      // 2. Delete this object
      context.DeleteObject(item);
    }
  }
}

Он компилируется нормально, но во время выполнения я получаю следующую ошибку:

'SLS.AnimalIntakeMgmt.DataTypes.TrackableCollection' не содержит определения для 'ToList'

Следовательно, вывод типа работает нормально. Проблема с определением ToList странная, так как TrackableCollection основана на ObservableCollection, которая, в свою очередь, основана на Collection.

ToList необходим, потому что в противном случае цикл foreach завершится неудачно, так как коллекция изменяется внутри цикла.

Все предложения приветствуются!

1 Ответ

2 голосов
/ 12 июля 2011

Проблема в том, что динамика не работает с методами расширения. Среда выполнения ищет только методы, определенные для самого динамического объекта.
Вам нужно вызвать ToList как статический метод:

foreach (dynamic item in Enumerable.ToList(entitySet))

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

...