将匿名类型转换为接口?

sgt*_*gtz 19 c# interface anonymous-types

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

public interface ICoOrd {
    int x { get; set; }
    int y { get; set; }
}      
Run Code Online (Sandbox Code Playgroud)

...

ICoOrd a = new {x = 44, y = 55};
Run Code Online (Sandbox Code Playgroud)

参考:

Ani*_*Ani 28

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

但是如果你坚持使用匿名类型,可以考虑使用动态接口代理框架ImpromptuInterface.

 var myInterface =  new { x = 44, y = 55 }.ActLike<ICoOrd>();
Run Code Online (Sandbox Code Playgroud)

  • ImpromptuInterface的+1.你也可以看看Clay(clay.codeplex.com) (3认同)

Jon*_*eet 7

不,匿名类型永远不会实现接口.dynamic不会让你投的接口下去,但让你刚刚访问两个属性.请注意,匿名类型是internal,所以如果要在使用的程序集中使用它们dynamic,则需要使用InternalsVisibleTo.

  • @sgtz:InternalsVisibleTo通常用于单元测试; 有时您希望对内部类进行单元测试,但希望测试程序集是不同的程序集.因此,您可以让测试程序集访问内部.它很少用于生产代码方案.请记住,程序集是*versionable*; 这是组件的整个*点*.在大多数情况下,您不希望*独立地更改两个组件*的版本*,这两个组件*看到彼此的内部*.如果您有两个需要查看彼此内部组件的程序集,请考虑将它们合并为一个. (6认同)
  • @sgtz:劳动密集型?这是一个单一的属性.如果你使用强类型的程序集,它需要更多的工作,但否则它非常简单.我经常用它进行单元测试. (2认同)