You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms中Type.GetConstructor返回null、GetConstructors为空问题求解

Xamarin.Forms 下 GetConstructor 返回null/ GetConstructors 返回空列表问题原因及解决方案

问题产生的核心原因

  • 链接器裁剪逻辑的隐性移除:即使你开启了Link everything,Xamarin的链接器只会保留被静态引用到的类型成员。如果你原生实现类的构造函数没有在平台项目里被直接静态调用,仅通过反射访问的话,链接器默认会将构造函数作为无用代码裁剪掉,这是该问题最高发的诱因。你之前项目能正常运行大概率是旧版本Xamarin.Forms的链接器裁剪规则更宽松,或者旧版本目标平台的编译逻辑会隐式保留反射访问的构造函数。
  • 类型上下文不匹配:你传递的Type对象所在的加载上下文和实际原生实现类的加载上下文不一致时,反射API无法识别到对应的构造函数,常见于跨程序集传递Type、或者平台项目和公共项目的程序集引用存在版本冲突的场景。
  • 构造函数的隐式修饰符问题:如果你的原生实现类的构造函数没有显式声明为public,或者包含了平台特定的修饰符没有被.NETStandard的反射上下文识别,也会出现GetConstructors返回空的情况。

可行的解决方案

1. 配置链接器跳过裁剪对应类型

在对应平台项目(Android/iOS)中添加自定义链接器配置文件,明确指定要保留目标原生实现类的所有构造函数,操作步骤如下:

  • iOS平台:在iOS项目中添加名为Linker.xml的文件,文件属性的「生成操作」设置为LinkDescription,文件内容示例:
<linker>
  <assembly fullname="你的原生实现类所在的程序集名称">
    <type fullname="原生实现类的完整命名空间.类名" preserve="all">
      <method name=".ctor" />
    </type>
  </assembly>
</linker>
  • Android平台:在Android项目中添加同样的xml文件,「生成操作」设置为LinkDescription即可,内容规则和iOS一致。

2. 强制静态引用构造函数

如果你不想修改链接器配置,可以在平台项目的初始化逻辑中添加一行无用的静态引用代码,让链接器识别到构造函数的存在,示例:

// 放在平台项目的AppDelegate或者MainActivity的初始化逻辑中
var useless = new 你的原生实现类(/* 对应构造函数的参数,随便传占位值也可以,只要能过编译 */);

3. 显式指定反射的绑定标记

调用GetConstructors时显式传入包含非公开、实例成员的绑定标记,避免默认绑定标记过滤掉你要找的构造函数,示例代码:

var constructors = targetType.GetConstructors(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);

内容的提问来源于stack exchange,提问作者Michelangelo Lattanzio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 14:24:04