Интерфейс реализации анонимного класса
У меня есть следующий код внутри метода:
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; включая свойства чтения и записи и события, которые в настоящее время не возможны даже для анонимно типизированных объектов.