将匿名类型转换为接口?

这似乎不可能吗? 那么什么是最好的解决方案? 展开/动态?

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

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

参考:

  • http://msdn.microsoft.com/en-us/library/system.runtime.compilerservices.internalsvisibletoattribute.internalsvisibletoattribute.aspx(Jon的建议)

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

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

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

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

我知道这是一个古老的问题和答案,但我偶然发现了这一点,希望对某些unit testing做同样的事情。 然后我发现我已经使用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(); aCord.SetupGet(c => cX).Returns(44); aCord.SetupGet(c => cY).Returns(55); var a = aCord.Object; } } 

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

 public void AnotherTest() { var aCord = Mock.Of(c => cX == 44 && cY == 55); //do stuff with aCord }