C# 仅具有一个实现的简单接口的匿名类型

C# 仅具有一个实现的简单接口的匿名类型,c#,.net,interface,anonymous-types,C#,.net,Interface,Anonymous Types,让我们假设我有以下接口: public interface IMyInterface { A MyA { get; } B MyB { get; } C MyC { get; } } A、B和C是三个不相关的类,它们不以任何方式实现IMyInterface 现在让我们假设这个接口只有一个实现。我可能会出于模拟的目的创建它,即使它只是由属性组成的 我设计了以下工厂: public static class MyManagerFactory { public

让我们假设我有以下接口:

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#不支持匿名对象上的匿名实现接口

如果您查找更多信息,您将看到Java具有此功能(例如,请参阅StackOverflow:)中的此问答


至少C#6不会包含此功能。从我的角度来看,它可能非常有用,而且在我的拙见中,这是我将偷来用C#实现的独特Java功能。

这可能是一个不错的功能,也可能不是,但目前C#不支持匿名对象上的匿名实现接口

如果您查找更多信息,您将看到Java具有此功能(例如,请参阅StackOverflow:)中的此问答


至少C#6不会包含此功能。从我的角度来看,它可能非常有用,而且在我的拙见中,这是我将偷来在C#中实现的独特Java功能。

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


C#不检查是否存在方法,而是检查类型是否定义为实现接口

这是不可能的,因为类型不实现接口。 它只是“巧合地”拥有接口的方法

C#不检查是否存在方法,而是检查类型是否定义为实现接口

我可能想为了嘲弄的目的创造它

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

var anon = new {
    MyA = new A(),
    MyB = new B(),
    MyC = new C()
};
如果只是为了模拟的目的,那么您可以只创建该接口的嵌套私有实现,而不需要一个全新的文件

public class MyClassTests
{

    private class MyDummyImplementation : IMyInterface { ... }    

    [Fact]
    public void Test()
    {
        var x = new MyDummyImplementation();
    }

}
我可能想为了嘲弄的目的创造它

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

var anon = new {
    MyA = new A(),
    MyB = new B(),
    MyC = new C()
};
如果只是为了模拟的目的,那么您可以只创建该接口的嵌套私有实现,而不需要一个全新的文件

public class MyClassTests
{

    private class MyDummyImplementation : IMyInterface { ... }    

    [Fact]
    public void Test()
    {
        var x = new MyDummyImplementation();
    }

}


您不能-您必须创建一个新类并实现接口。但是,您不需要将它放在自己的文件中。它必须是一个接口吗?你能不能把它改成一个类并实例化这个类而不是一个匿名类型?匿名类型不能实现一个接口:请看@MikeEason,接口将被注入到客户机/消费者中,这也会使我在测试时的生活更轻松,所以我试图避免一个具体的接口class@MatiCicero我懂了,我想你的问题可能是你不能-你必须创建一个新类并实现接口。但是,您不需要将它放在自己的文件中。它必须是一个接口吗?你能不能把它改成一个类并实例化这个类而不是一个匿名类型?匿名类型不能实现一个接口:请看@MikeEason,接口将被注入到客户机/消费者中,这也会使我在测试时的生活更轻松,所以我试图避免一个具体的接口class@MatiCicero我懂了,我想你可能会问这个问题:匿名类型不能声明成员方法。那么,您将如何实现具有某些方法的接口?@Kryptos Dreaming是免费的。这只是一个愿望:D@Kryptos无论如何,你可以使用委托,不是吗?是的,但委托基本上是封装方法的对象。你的接口仍然可以有属性。请注意,我也会发现这非常有用。我将分享你的梦想;)@氪星错了<代码>新建{DoStuff=newaction(()=>Console.WriteLine())}。我们已经有了匿名方法和委托类型推断:这不会那么容易:匿名类型不能声明成员方法。那么,您将如何实现具有某些方法的接口?@Kryptos Dreaming是免费的。这只是一个愿望:D@Kryptos无论如何,你可以使用委托,不是吗?是的,但委托基本上是封装方法的对象。你的接口仍然可以有属性。请注意,我也会发现这非常有用。我将分享你的梦想;)@氪星错了<代码>新建{DoStuff=newaction(()=>Console.WriteLine())}。我们已经有匿名方法和委托类型推断:D