C# 按接口从抽象类到子类的继承数据注释?

C# 按接口从抽象类到子类的继承数据注释?,c#,asp.net-core-mvc,abstract-class,data-annotations,interface-class,C#,Asp.net Core Mvc,Abstract Class,Data Annotations,Interface Class,这是我的父抽象类: 公共抽象类PersonViewModel:IPersonViewModel { #区域数据验证模型 [必需(ErrorMessage=“ErrorInsertYourMobileNumber”)] [显示(Name=“MobileNumber”)] //--正则表达式=============================(1234567890)==!(ValiAsr1) [正则表达式(模式:@“(\d{10})”,ErrorMessage=“ErrorNotFindMob

这是我的父抽象类:

公共抽象类PersonViewModel:IPersonViewModel
{
#区域数据验证模型
[必需(ErrorMessage=“ErrorInsertYourMobileNumber”)]
[显示(Name=“MobileNumber”)]
//--正则表达式=============================(1234567890)==!(ValiAsr1)
[正则表达式(模式:@“(\d{10})”,ErrorMessage=“ErrorNotFindMobileNumber”)]
#端区
公共字符串MobileNumber{get;set;}
#区域数据验证模型
[必需(ErrorMessage=“ErrorInsertPassword”)]
[显示(Name=“密码”)]
[数据类型(数据类型.密码)]
#端区
公共字符串密码{get;set;}
#区域数据验证模型
[必需(ErrorMessage=“ErrorInsertReTypePassword”)]
[显示(Name=“ReTypePassword”)]
[数据类型(数据类型.密码)]
#端区
公共字符串重新键入密码{get;set;}
}
这是我的界面:

公共接口IPersonViewModel
{
字符串移动枚举器{get;set;}
字符串密码{get;set;}
字符串重新键入密码{get;set;}
}
和人员类别:

公共抽象类人物
{
#区域主要属性
公共Guid PersonId{get;set;}
#区域数据验证模型
[必需(ErrorMessage=“ErrorInsertYourFirstName”)]
[显示(Name=“FirstName”)]
[StringLength(15,MinimumLength=2,ErrorMessage=“ErrorMin2Max15Words”)]
[正则表达式(模式:@“(^[^-\s\d*]\d*$)”,ErrorMessage=“ErrorNotAllowHitSpaceInfirStandNumber”)]
#端区
#区域验证
[列(TypeName=“varchar(max)”)]
#端区
公共字符串名{get;set;}
#区域数据验证模型
[必需(ErrorMessage=“ErrorInsertYourLastName”)]
[显示(Name=“LastName”)]
[StringLength(15,MinimumLength=2,ErrorMessage=“ErrorMin2Max15Words”)]
[正则表达式(模式:@“(^[^-\s\d*]\d*$)”,ErrorMessage=“ErrorNotAllowHitSpaceInfirStandNumber”)]
#端区
#区域验证
[列(TypeName=“varchar(max)”)]
#端区
公共字符串LastName{get;set;}
#区域数据验证模型
[必需]
[显示(Name=“Gender”)]
#端区
#区域验证
[列(TypeName=“varchar(max)”)]
#端区
公共字符串{get;set;}
#区域数据验证模型
[必需(ErrorMessage=“ErrorInsertYourProfileImage”)]
[显示(Name=“ProfileImage”)]
//--RegularExpression======================(test.jpg)| |(folder/test.jpg)
[RegularExpression(模式:@”([^\s]+(\.(?i)(jpg|png|gif|bmp))$)”,ErrorMessage=“ErrorItsNotImageFile”)]
#端区
#区域验证
[列(TypeName=“varchar(max)”)]
#端区
公共字符串配置文件映像{get;set;}
#端区
公共字符串FullName=>$“{FirstName}{LastName}”;
}
这是我的孩子课:

public类UserViewModel:Person,IPersonViewModel
{
#区域主要属性
#区域数据验证模型
[显示(Name=“电子邮件”)]
[数据类型(数据类型.电子邮件地址)]
[RegularExpression(@“^([a-zA-Z0-9\-\.]+)@([a-zA-Z0-9\-\.]+)\([a-zA-Z]{2,5})$”,ErrorMessage=“ErrorValidEmail”)]
#端区
公共字符串电子邮件{get;set;}
公共字符串MobileNumber{get;set;}
公共字符串密码{get;set;}
公共字符串重新键入密码{get;set;}
#端区
}
我的问题是如何通过接口将数据注释继承到子类

如果没有接口,我不能直接这样做,因为它显然是多重继承

这是一个好方法吗

还有别的办法吗


事实上,我不想对数据注释有多个引用。有什么方法可以做到这一点吗

从基类继承的属性具有这些属性,没有问题

接口中定义的属性不会传递给实现该接口的类。你根本无法做到这一点:

public interface IPersonViewModel
{
    [Required]
    string MobileNumber { get; set; }
}

public class PersonViewModel : IPersonViewModel
{
    // this will NOT get the [Required] attribute from the interface
    public string MobileNumber { get; set; }
}

从基类继承的属性具有这些属性,没有问题

接口中定义的属性不会传递给实现该接口的类。你根本无法做到这一点:

public interface IPersonViewModel
{
    [Required]
    string MobileNumber { get; set; }
}

public class PersonViewModel : IPersonViewModel
{
    // this will NOT get the [Required] attribute from the interface
    public string MobileNumber { get; set; }
}

不要在派生类中重新定义它们,因为它们在基类中不是抽象的。@juharr它是从接口继承的,我必须实现它!等等,
Preson
类是什么。不应该继承
UserViewModel
inherit
PersonViewModel
?事实上是的,但是Person也是继承的。Person类是另一个用于EF.OK的抽象类,如果
UserViewMdoel
继承自
PersonViewModel
,它将获得您为实现接口而定义的属性和属性,无需在派生类中重新实现它们。不要在派生类中重新定义它们,因为它们在基类中不是抽象的。@juharr它是从接口继承的,我必须实现它!等等,
Preson
类是什么。不应该继承
UserViewModel
inherit
PersonViewModel
?事实上是的,但是Person也是继承的。Person类是另一个用于EF.OK的抽象类,如果
UserViewMdoel
继承自
PersonViewModel
,它将获得您为实现接口而定义的属性和属性,而无需在派生类中重新实现它们。我认为最好的方法是将Person-EF模型与PersonViewModel分开。这是真的吗?我的意思是分离责任不是重复属性,属性可以重复。这是正确的吗?@paradise\u human我只是说接口上的注释不会传递给实现它们的类。除此之外,我不确定你在寻找什么。属性的重复在层之间经常发生。大多数人使用Aut之类的解决方案