我有一个针对WSA、NET45和WP8的可移植类库,我也想针对SL5。愚蠢的是,99%的库代码都是SL兼容的,但in有几个地方我调用反射API来检索类型属性或字段:
var fields = myType.GetTypeInfo().DeclaredFields;
不幸的是,GetTypeInfo在SL5中不可用,所以上面的代码不会编译。所以我基本上有选择:
- 不要从PCL中针对SL5,所以我需要为Silverlight保留一个单独的库
- 从使用反射的PCL代码中提取,因此PCL需要在启动时解决此依赖关系
- 在运行时做一些明智的事情,这样PCL就可以检测哪些方法可用,并调用适当的方法
选项1是可以的,但我宁愿找到一个替代方案来维护一个重复的库。如果我必须提取一大块功能,那么选项2就可以了,因此值得引入引导程序。当有几行没有编译时,拖动DI/IoC是很愚蠢的。
因此,我在考虑选项3时,甚至没有明确理解它是否可能。反射是我的朋友,但它是反射API不匹配,我正在努力克服。
建议/经验分享不胜感激。
玩过代码后,我突然想到我可以简单地使用旧的检索字段的方法:
var fields = myType.GetFields(BindingFlags.Public | BindingFlags.Static);
我的印象是,由于反射API更改,这种语法在PCL中不可用,但事实上恰恰相反:使用这种语法,我可以同时针对两者。NET 4.0.3、.NET 4.5、用于WSA、WP8和SL5的.NET。
这个怎么样?
Reflection.Assembly = Reflection.IntrospectionExtensions.GetTypeInfo(GetType(*anyTypeInAssembly*)).Assembly