【发布时间】:2013-08-20 20:00:33
【问题描述】:
我正在尝试构建一个可移植类库,该类库在可用时使用来自平台的实现。例如,Lazy<T> 在 .NET 4.5、Windows Store Apps、Windows Phone 8 上可用,但在 Windows Phone 7、Silverlight 4 上不可用。当我的 PCL 加载到具有 Lazy<T> 实现的平台之一时,我想用平台的实现。当它在平台上不可用时,我想使用我自己的实现。好像是可以的,因为微软BCL在做,但是我还没想好怎么实现。
我已经读到,通过使用TypeForwardedToAttribute,您可以重定向 PCL 以使用来自平台的实现。我不太确定如何配置我的 Visual Studio 项目以实现此结果。如果 CoreLib 是我的库,并且 ShimLib 包含我对 Lazy<T> 的实现。我在哪里添加 TypeForwardedToAttribute?该属性需要一个实际的类型引用typeof(System.Lazy<>),当Windows Phone 7 以PCL 为目标时,这不起作用。如果我删除 Windows Phone 7,那么我无法将 CoreLib 的引用添加到 ShimLib,因为 ShimLib 不支持 CoreLib 支持的所有平台。我该如何处理?
是的,我知道Lazy<T> 非常容易实现,但这只是一个示例,我的实际情况适用于更多不那么容易实现的类。
【问题讨论】:
-
[TypeForwardedTo] 并没有真正解决底层部署问题。对于 PCL,Microsoft 负责根据平台部署可能包含或不包含 [TypeForwardedTo] 的程序集。您自己的转发课程不会获得相同的帮助。
-
Lazy
如果您忽略LazyThreadSafetyMode,则“超级容易实现”。不用担心,我已经为您提供了保障:Theraot's Lazy<T> for .NET 3.5 or previous 如需替代方案,请参阅LazyNeedle<T>(请报告任何错误)。 完全披露:是的,我是同一个威胁。
标签: c# .net portable-class-library