这是一个很长的镜头,但我有一个有趣的编码情况,我希望能够动态创建匿名类,但能够将它们作为参数传递给期望接口或子类的方法。换句话说,我希望能够做到这样的事情:
public class MyBase { ... }
public void Foo(MyBase something)
{
...
}
...
var q = db.SomeTable.Select(t =>
new : MyBase // yeah, I know I can't do this...
{
t.Field1,
t.Field2,
});
foreach (var item in q)
Foo(item);
除了使用命名类之外,还有什么办法吗?
答案 0 :(得分:48)
没有。匿名类型总是隐式派生自object
,并且永远不会实现任何接口。
来自C#5规范的第7.6.10.6节:
匿名对象初始值设定项声明匿名类型并返回该类型的实例。匿名类型是直接从
object
继承的无名类类型。
因此,如果您想要实现一个不同的基类或,那么您需要一个命名类型。
答案 1 :(得分:7)
答案 2 :(得分:2)
无法扩展匿名但您可以声明您的方法接受动态参数,如果您确实需要这样做。
答案 3 :(得分:0)
简短回答:否
长答案: 您可以使用C#代理类。有几种工具可以代理类。例如最小起订量。 https://github.com/moq/moq4