只有一个实现的简单接口的匿名类型

本文关键字:类型 接口 简单 有一个 实现 | 更新日期: 2023-09-27 17:52:52

假设我有以下接口:

public interface IMyInterface {
     A MyA { get; }
     B MyB { get; }
     C MyC { get; }
}

ABC是三个不相关的类,不以任何方式实现IMyInterface

现在让我们假设这个接口只有一个实现。我可能想创建它是为了模拟目的,即使它只是由属性组成。

我设计了如下的工厂:

public static class MyManagerFactory {
    public static IMyManager CreateMyManager() {
        //Return the implementation
    }
}

我不想为属性的实现创建一个全新的文件和类型,所以我正在寻找一个匿名类型:

var anon = new {
    MyA = new A(),
    MyB = new B(),
    MyC = new C()
};

但是我不能返回anon,因为它的类型是object,编译器不能知道我正在实现我的接口。

所以我想做一个演员:

IMyInterface casted = anon as IMyInterface;

但这也不会编译,说明:

无法通过引用转换、装箱转换、拆箱转换、包装转换或空类型转换将类型'AnonymousType#1'转换为'IMyInterface'。

我认为as转换应该在运行时完成,如果(出于任何原因)失败,它会简单地返回null

但是这个错误是编译时出现的。

如何返回IMyInterface实例?

只有一个实现的简单接口的匿名类型

这是不可能的,因为该类型没有实现接口。它只是碰巧拥有接口的方法

c#不检查方法是否呈现,它检查类型是否定义为实现接口。

我可能想创建它是为了嘲弄的目的,

我不想为属性的实现创建一个全新的文件和类型,所以我正在寻找一个匿名类型:

如果它只是为了模拟目的,那么您可以创建该接口的嵌套私有实现,而不需要创建整个新文件

public class MyClassTests
{
    private class MyDummyImplementation : IMyInterface { ... }    
    [Fact]
    public void Test()
    {
        var x = new MyDummyImplementation();
    }
}

这可能是一个很好的特性,但目前c#不支持匿名对象上的匿名实现接口。

如果你寻找更多的信息,你会发现Java有这个特性(例如,在StackOverflow中看到这个问题:一个匿名类如何使用"扩展")。或"implements"?) .

至少c# 6不会包含这个特性。从我的角度来看,它可能非常有用,在我看来,这是我想在c#中实现的独特的Java特性。