2010-06-14 5 views
14

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

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 

ответ

12

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

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

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

1

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

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

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

+0

Правда, это было бы аккуратно. Возможно, укажите интерфейс анонимного класса следующим образом: new {IFoo.Bar = 2}: IFoo; – flayn

12

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

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

Это потрясающе! Я играю с ним в LINQPad, и он работает блестяще. – flayn

Смежные вопросы