将匿名类型转换为接口?

时间:2012-02-12 14:44:08

标签: c# interface anonymous-types

这似乎不可能?那么什么是最好的解决方案? Expando / dynamic?

public interface ICoOrd {
    int x { get; set; }
    int y { get; set; }
}      

...

ICoOrd a = new {x = 44, y = 55};

参考:

3 个答案:

答案 0 :(得分:27)

最好的“解决方法”是创建和使用实现接口的普通“命名”类型。

但如果您坚持使用匿名类型,请考虑使用动态接口代理框架,如ImpromptuInterface

 var myInterface =  new { x = 44, y = 55 }.ActLike<ICoOrd>();

答案 1 :(得分:7)

不,匿名类型永远不会实现接口。 dynamic也不允许您转换为界面,但让您只访问这两个属性。请注意,匿名类型为internal,因此如果您想使用dynamic在程序集中使用它们,则需要使用InternalsVisibleTo

答案 2 :(得分:2)

我知道这是一个古老的问题和答案,但我偶然发现了这个问题,希望对某些单元测试做同样的事情。然后我发现我已经使用Moq(facepalm)做了类似的事情。

我喜欢ImpromptuInterface的另一个建议,但我已经在使用Moq并且觉得它有更大的追随者(意见而不是事实)会更稳定并且支持更长时间。

所以对于这种情况就像是

public interface ICoOrd
{
    int X { get; set; }
    int Y { get; set; }
}

public class Sample
{

    public void Test()
    {
        var aCord = new Mock<ICoOrd>();
        aCord.SetupGet(c => c.X).Returns(44);
        aCord.SetupGet(c => c.Y).Returns(55);

        var a = aCord.Object;
    }
}

编辑:只是添加另一种方法来模拟电源线,开始这样做并且喜欢它好一点。

public void AnotherTest()
{
    var aCord = Mock.Of<ICoOrd>(c => c.X == 44 && c.Y == 55);
    //do stuff with aCord
}