C#匿名类可以实现一个接口吗?
是否有可能有一个匿名类型实现一个接口。 我有一段我想工作的代码,但不知道该怎么做。
我有几个答案,要么不说,要么创建一个实现接口的类来构造新的实例。 这并不是很理想,但我想知道是否有一种机制可以在简单的界面之上创建一个薄动态类。
public interface DummyInterface
{
string A { get; }
string B { get; }
}
public class DummySource
{
public string A { get; set; }
public string C { get; set; }
public string D { get; set; }
}
public class Test
{
public void WillThisWork()
{
var source = new DummySource[0];
var values = from value in source
select new
{
A = value.A,
B = value.C + "_" + value.D
};
DoSomethingWithDummyInterface(values);
}
public void DoSomethingWithDummyInterface(IEnumerable<DummyInterface> values)
{
foreach (var value in values)
{
Console.WriteLine("A = '{0}', B = '{1}'", value.A, value.B);
}
}
}
我发现了一篇介绍一种方法的文章Dynamic interface wrapping。 这是做这件事的最好方法吗?
不,匿名类型不能实现一个接口。 从C#编程指南:
匿名类型是由一个或多个公共只读属性组成的类类型。 没有其他种类的成员如方法或事件被允许。 除了对象之外,匿名类型不能转换为任何接口或类型。
虽然这可能是一个两年前的问题,虽然线程中的答案都是真实的,但我忍不住要求告诉你实际上有可能让一个匿名类实现一个接口,即使它需要一个接口有点创造性的欺骗去那里。
早在2008年,我就为我当时的雇主编写了一个自定义的LINQ提供程序,并且有一次我需要能够从其他匿名类中告诉“我的”匿名类,这意味着让他们实现一个可用于键入检查的接口他们。 我们解决它的方式是使用方面(我们使用PostSharp),直接在IL中添加接口实现。 所以,实际上, 让匿名类实现接口是可行的 ,你只需稍微弯曲规则就可以实现。
将匿名类型转换为接口一直是我想要的一段时间,但不幸的是,当前的实现迫使你有一个接口的实现。
围绕它的最佳解决方案是使用某种类型的动态代理,为您创建实施。 使用优秀的LinFu项目你可以取代
select new
{
A = value.A,
B = value.C + "_" + value.D
};
同
select new DynamicObject(new
{
A = value.A,
B = value.C + "_" + value.D
}).CreateDuck<DummyInterface>();
链接地址: http://www.djcxy.com/p/51421.html