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
相关产品推荐
相关产品推荐

