C# 继承的类属性'DisplayAttribute'未被重写?

C# 继承的类属性'DisplayAttribute'未被重写?,c#,asp.net-mvc,inheritance,overriding,data-annotations,C#,Asp.net Mvc,Inheritance,Overriding,Data Annotations,我有一个基类,它继承了另一个基类的属性,并添加了一个新的基类,如下所示: public class DataSourceWithIntervalBase : DataSourceBase { [MaxLength(100)] [Display(Name = "Interval")] public virtual string Interval1 { get; set; } } @switch (Model.FeedType) // switch to cast corr

我有一个基类,它继承了另一个基类的属性,并添加了一个新的基类,如下所示:

public class DataSourceWithIntervalBase : DataSourceBase
{
    [MaxLength(100)]
    [Display(Name = "Interval")]
    public virtual string Interval1 { get; set; }
}
@switch (Model.FeedType) // switch to cast correct Model Type in order to access proper DisplayAttribute for Interval1
{
    case Model.FeedType.RSS:
        break;
    case Model.FeedType.XML:
    @Html.LabelFor(m => ((XmlDataSource)m).Interval1)
        break;
    case Model.FeedType.SqlServer:
        break;
    case Model.FeedType.Excel2003:
    @Html.LabelFor(m => ((Excel2003DataSource)m).Interval1)
        break;
    case Model.FeedType.InterLinkFeeder:
        break;
    case Model.FeedType.Atom:
        break;
    case Model.FeedType.Excel2007:
    @Html.LabelFor(m => ((Excel2007DataSource)m).Interval1)
        break;
    case Model.FeedType.JSON:
    @Html.LabelFor(m => ((JsonDataSource)m).Interval1)
        break;
    default:
        break;
}
DataSourceBase
没有什么特别之处,它只有一些属性需要允许用户编辑

然而,Intervalbase数据源进一步被其他类继承。它们都非常相似,除了它们的
显示
属性,用于用户界面

下面是其中一个类,例如:

public class SqlServerDataSource : DataSourceWithIntervalBase
{
    public SqlServerDataSource()
    {
        FeedType = FeedType.SqlServer;
    }

    [Required]
    [MaxLength(500)]
    [Display(Name = "Connection String")]
    public override string Url { get; set; }

    [MaxLength(100)]
    [Display(Name = "Table Name")]
    public override string Interval1 { get; set; }
}
您可以看到我在这里覆盖了两个属性
Url
,位于
DataSourceBase
中,以及
Interval1
,位于
DataSourceWithIntervalBase

使用此继承时,似乎没有任何东西会中断。它确实有效。但是,
显示
属性不会被覆盖。
DataSourceBase
Url
实际上没有Url,但在编辑器视图中使用时,它仍然没有被考虑。
Interval1
属性标记如下:

Interval

那么,如何强制继承类正确覆盖基类的
Display
属性呢?

我不知道这是否是最佳实践,但它是有效的

如果没有其他答案可以改进/绕过此解决方案,我将坚持使用此解决方案,并希望它能帮助其他人

我在
DataSource
视图模型的类型上使用了
switch
语句,并铸造了相应的类型以直接访问其
DisplayAttribute
,如下所示:

public class DataSourceWithIntervalBase : DataSourceBase
{
    [MaxLength(100)]
    [Display(Name = "Interval")]
    public virtual string Interval1 { get; set; }
}
@switch (Model.FeedType) // switch to cast correct Model Type in order to access proper DisplayAttribute for Interval1
{
    case Model.FeedType.RSS:
        break;
    case Model.FeedType.XML:
    @Html.LabelFor(m => ((XmlDataSource)m).Interval1)
        break;
    case Model.FeedType.SqlServer:
        break;
    case Model.FeedType.Excel2003:
    @Html.LabelFor(m => ((Excel2003DataSource)m).Interval1)
        break;
    case Model.FeedType.InterLinkFeeder:
        break;
    case Model.FeedType.Atom:
        break;
    case Model.FeedType.Excel2007:
    @Html.LabelFor(m => ((Excel2007DataSource)m).Interval1)
        break;
    case Model.FeedType.JSON:
    @Html.LabelFor(m => ((JsonDataSource)m).Interval1)
        break;
    default:
        break;
}
请记住,我跳过了各种类型,因为此
开关
语句位于不用于这些类型的
编辑器模板


您可以很容易地将此解决方案应用于您的特定情况。

除非我误解了Intervalbase的
数据源的用法,否则您实际上不需要
[Display]
属性。它没有解决继承问题,但它解决了你的问题。不,它实际上没有解决我的问题。我以前没有使用
Display
属性,但是我添加它是为了查看继承类是否会覆盖它,因为它是显式定义的。事实并非如此。这意味着在指定它的过程中还有另一个基类。该属性将在第一次接触时应用(即在第一个类上显示)。这也意味着你的问题不完整。不。。。在我的代码示例中,您可以清楚地看到,
SqlServerDataSource
直接继承自
DataSourceWithIntervalBase