猿问

C#匿名类能实现接口吗?

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);
        }
    }}

我找到一篇文章动态界面包装这说明了一种方法。这是最好的方法吗?


Cats萌萌
浏览 1837回答 3
3回答

守候你守候我

虽然这可能是一个有两年历史的问题,而且所有的答案都是正确的,但我忍不住要告诉你这是事实。有可能让一个匿名类实现一个接口,尽管要达到这个目的需要一些创造性的欺骗。早在2008年,我就为当时的雇主编写了一个自定义LINQ提供程序,我一度需要能够区分“我的”匿名类和其他匿名类,这意味着让它们实现一个接口,我可以用来输入它们。我们解决这一问题的方法是使用方面(我们使用了波斯特),直接在IL中添加接口实现。所以,事实上,让匿名类实现接口是可行的。你只需要稍微修改一下规则就可以了。

九州编程

将匿名类型转换到接口是我一段时间以来一直想要的东西,但不幸的是,当前的实现迫使您拥有该接口的实现。它的最佳解决方案是拥有某种类型的动态代理,为您创建实现。利用优秀临富工程你可以代替select&nbsp;new{ &nbsp;&nbsp;A&nbsp;=&nbsp;value.A, &nbsp;&nbsp;B&nbsp;=&nbsp;value.C&nbsp;+&nbsp;"_"&nbsp;+&nbsp;value.D};带着&nbsp;select&nbsp;new&nbsp;DynamicObject(new &nbsp;{ &nbsp;&nbsp;&nbsp;A&nbsp;=&nbsp;value.A, &nbsp;&nbsp;&nbsp;B&nbsp;=&nbsp;value.C&nbsp;+&nbsp;"_"&nbsp;+&nbsp;value.D&nbsp;}).CreateDuck<DummyInterface>();
随时随地看视频慕课网APP
我要回答