【问题标题】:Portable Class Library Reflection GetField可移植类库反射GetField
【发布时间】:2013-12-10 22:11:31
【问题描述】:

我目前正在尝试将 Xamarin.iOS 应用程序库转换为 PCL。我有这段代码无法编译:

    private void SetPrivateField<T>(object item, string fieldName, object value) {
        typeof(T).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic)
            .SetValue(item, value);
    }

如您所见,我正在尝试为类型设置私有字段。还有其他方法吗?

编辑 这编译。它会做同样的事情吗?

 private void SetPrivateField<T>(object item, string fieldName, object value) {
      typeof(T).GetRuntimeField(fieldName).SetValue(item,value);
 }

【问题讨论】:

  • 报什么编译器?错误?
  • @poupou 当前上下文中不存在名称“BindingFlags”(我在 Visual Studio 中编译)
  • 您使用的是什么配置文件? 78和158暴露的反射api有很大区别
  • @StephaneDelcroix 我正在使用配置文件 78。请参阅上面的编辑。
  • @ChrisKooken 你知道如何在 PCL 中动态访问继承的属性吗?

标签: c# .net xamarin.ios portable-class-library


【解决方案1】:

这最终是正确的代码。

private void SetPrivateField<T>(object item, string fieldName, object value) {
    typeof(T).GetTypeInfo().GetDeclaredField(fieldName).SetValue(item,value);
}

【讨论】:

  • 这是正确的答案。为了获得更好的性能,通常最好缓存 setter。
【解决方案2】:

针对较新平台的可移植类库中的反射 API 有所不同。有关我们为什么这样做以及如何使用新 API 的一些信息,请参阅以下链接:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    相关资源
    最近更新 更多