这似乎不可能?那么什么是最好的解决方案? Expando / dynamic?
public interface ICoOrd {
int x { get; set; }
int y { get; set; }
}
...
ICoOrd a = new {x = 44, y = 55};
参考:
答案 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
}