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

C#如何不重载Address类即可在Person类中重写Street属性并添加数据注解

可行实现方案说明

你的需求可以实现,你原代码里public new Address.Street { get;set; }的写法属于语法错误,没有直接通过类名访问实例成员来定义属性的语法,以下是两种通用且无需修改Address类的实现方案:

方案1:添加代理包装属性(最通用)

直接在Person类中新增一个代理属性,将读写逻辑转发到内部Address实例的Street属性,数据注解直接加在这个代理属性上即可,适配所有支持数据注解的场景(UI绑定、模型验证、自动生成文档等)。
修改后的Person类代码如下:

public class Person
{
    public string Firstname { get; set; }
    public string Lastname { get; set; }

    public Address Address { get; set; }

    [Display(Name = "Street with street number")]
    public string Street
    {
        get => Address?.Street;
        set 
        {
            // 可根据需要加Address为空的自定义处理逻辑
            if (Address != null)
                Address.Street = value;
        }
    }
}

使用时你既可以继续通过person.Address.Street读写原始属性,也可以通过person.Street读取到带自定义数据注解的属性,二者值完全同步。

方案2:框架级Fluent元数据配置(适用于特定场景)

如果你是在ASP.NET Core、EF Core等支持Fluent配置元数据的框架下使用,不需要修改任何业务类代码,直接在框架启动配置阶段指定Person.Address.Street的显示名即可。
以ASP.NET Core MVC为例,配置示例如下:

builder.Services.AddControllersWithViews()
    .AddMvcOptions(options =>
    {
        options.ModelMetadataDetailsProviders.Add(
            new CustomDisplayMetadataProvider(
                typeof(Person), 
                nameof(Person.Address), 
                nameof(Address.Street), 
                "Street with street number"));
    });

该方案的优势是完全不侵入业务类代码,适合需要批量配置元数据的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 07:15:07