【问题标题】:How to target Silverlight from a portable class library that uses reflection API?如何从使用反射 API 的可移植类库中定位 Silverlight?
【发布时间】:2013-02-03 17:11:45
【问题描述】:

我有一个针对 WSA、NET45 和 WP8 的可移植类库,我也想针对 SL5。愚蠢的是 99% 的库代码都符合 SL 标准,但有几个地方我调用反射 API 来检索类型属性或字段:

var fields = myType.GetTypeInfo().DeclaredFields;

很遗憾,GetTypeInfo 在 SL5 中不可用,因此上述代码无法编译。所以我基本上有选择:

  1. 不要从 PCL 定位 SL5,因此我需要为 Silverlight 保留一个单独的库。
  2. 从使用反射的 PCL 代码中提取,因此 PCL 需要解决这种对启动的依赖性。
  3. 在运行时做一些智能的事情,这样 PCL 可以检测哪些方法可用并调用适当的方法。

选项 1 没问题,但我宁愿找到维护重复库的替代方法。 如果我必须提取大量功能,那么选项 2 就可以了,因此值得引入一个引导程序。当几行无法编译时,拖动 DI/IoC 是愚蠢的。

所以我正在考虑选项 3,但没有清楚地了解它是否可能。反射是我的朋友,但这是我正在努力克服的反射 API 不匹配问题。

建议/经验分享表示赞赏。

【问题讨论】:

    标签: reflection silverlight-5.0 portable-class-library


    【解决方案1】:

    在玩过代码后,我发现我可以简单地使用旧的检索字段的方法:

    var fields = myType.GetFields(BindingFlags.Public | BindingFlags.Static);
    

    我的印象是,由于反射 API 更改,此语法在 PCL 中不可用,但实际上恰恰相反:使用此语法我可以同时针对 .NET 4.0.3、.NET 4.5、.NET for WSA, WP8 和 SL5。

    【讨论】:

      【解决方案2】:

      这个怎么样?

      Reflection.Assembly = Reflection.IntrospectionExtensions.GetTypeInfo(GetType(*anyTypeInAssembly*)).Assembly
      

      【讨论】:

      • 这没有提供问题的答案。要批评或要求作者澄清,请在他们的帖子下方发表评论 - 您可以随时评论自己的帖子,一旦您有足够的reputation,您就可以comment on any post
      • 问题是关于 GetTypeInfo 作为类型的直接方法不可用。 Reflection.IntrospectionExtensions.GetTypeInfo(type) 是另一种实现方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-24
      • 2013-08-20
      • 1970-01-01
      相关资源
      最近更新 更多