我在方法中有以下代码:
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
答案 0 :(得分:12)
不,这是不可能的。
匿名类型在内部是一个轻量级的传输对象。您需要比小语法提供的功能更多的瞬间,您必须将其实现为普通的命名类型。
继承和接口实现,属性,方法,带代码的属性等等。不可能。
答案 1 :(得分:12)
开源框架impromptu-interface将允许您使用轻量级代理和DLR有效地执行此操作。
new { Name = "Red", IsSelected = true}.ActLike<ISelectable>();
答案 2 :(得分: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成员的所有;包括在匿名类型对象上当前甚至不可能的读/写属性和事件。