只有一个实现的简单接口的匿名类型
本文关键字:类型 接口 简单 有一个 实现 | 更新日期: 2023-09-27 17:52:52
假设我有以下接口:
public interface IMyInterface {
A MyA { get; }
B MyB { get; }
C MyC { get; }
}
A
、B
和C
是三个不相关的类,不以任何方式实现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特性。