Интерфейс реализации анонимного класса

У меня есть следующий код внутри метода:

 var list = new[]
  {
   new { Name = "Red", IsSelected = true },
   new { Name = "Green", IsSelected = false },
   new { Name = "Blue", IsSelected = false },
  };

Я бы хотел вызвать функцию, которая требует список элементов с каждым элементом, реализующим интерфейс (ISelectable). Я знаю, как это делается с обычными классами, но в этом случае я только пытаюсь заполнить некоторые демо-данные.

Возможно ли создать анонимный класс, реализующий интерфейс?

вот так:

new { Name = "Red", IsSelected = true } : ISelectable

Ответы

Ответ 1

Нет, это невозможно.

Анонимный тип должен быть легким транспортным объектом внутри. В тот момент, когда вам требуется больше функциональности, чем предоставляет небольшой синтаксис, вы должны реализовать его как обычный именованный тип.

Такие вещи, как наследование и реализация интерфейса, атрибуты, методы, свойства с кодом и т.д. Невозможно.

Ответ 2

Рамка с открытым исходным кодом impromptu-interface позволит вам эффективно сделать это с помощью легкого прокси и DLR.

new { Name = "Red", IsSelected = true}.ActLike<ISelectable>();

Ответ 3

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

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

Самый минимальный синтаксис для анонимного типа, который наследует интерфейс IFoo, будет чем-то вроде

new {IFoo.Bar = 2} // if IFoo.Bar is a property

or

new {IFoo.Bar() = () => do stuff} if IFoo.Bar is a method

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