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

Xamarin Forms页面继承泛型基类时g.cs文件修改被覆盖如何解决

解决Xamarin Forms泛型页面基类自动生成代码被覆盖问题

核心原因

自动生成的.g.cs分部类是XAML编译工具链根据XAML根节点配置自动生成的,每次XAML文件修改都会触发重写,任何手动修改的内容都会被清空,因此不要直接修改该文件,所有配置需通过XAML和自己编写的分部类完成。

可行解决方案

方案1:在XAML中直接声明泛型基类(推荐)

通过XAML的x:TypeArguments特性指定泛型参数,工具链会自动生成正确的泛型基类声明,无需手动修改.g.cs文件。

  1. XAML文件配置示例(假设你的泛型基类为MyBaseContentPage<TViewModel>,当前页面对应的泛型参数为MyViewModel):
<local:MyBaseContentPage 
    x:TypeArguments="local:MyViewModel"
    xmlns="http://xamarin.com/schemas/2014/forms"
    xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
    xmlns:local="clr-namespace:你的项目命名空间"
    x:Class="你的项目命名空间.MyContentPage">
    <!-- 此处编写你的页面内容 -->
</local:MyBaseContentPage>
  1. 自行编写的分部类配置:
// 该文件是你自己创建的.cs文件,不是自动生成的.g.cs文件
public partial class MyContentPage : MyBaseContentPage<MyViewModel>
{
    public MyContentPage()
    {
        InitializeComponent();
    }
    // 你的页面逻辑代码
}

方案2:兼容旧版本的过渡方案

如果使用的Xamarin Forms版本过旧不支持根节点泛型声明,可以新增一层非泛型基类做中转:

// 非泛型基类,继承ContentPage
public class MyBaseContentPage : ContentPage
{
    // 可以在这里放不需要泛型的公共逻辑
}

// 泛型基类,继承非泛型基类
public class MyBaseContentPage<T> : MyBaseContentPage
{
    // 在这里放需要泛型的公共逻辑
    public T ViewModel { get; set; }
}

这种场景下XAML根节点可以先声明为非泛型的MyBaseContentPage,你自己编写的分部类再继承泛型版本即可,不会和自动生成的代码冲突。

注意事项

  • x:TypeArguments中如果需要传入多个泛型参数,用逗号分隔即可,例如x:TypeArguments="local:FirstParam, local:SecondParam"
  • 确保XAML中声明的命名空间和对应类的实际命名空间完全一致,否则会触发编译错误

内容的提问来源于stack exchange,提问作者Ido Dvir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 17:06:04