C#从父集合的项中获取子属性

C#从父集合的项中获取子属性,c#,oop,inheritance,C#,Oop,Inheritance,我正在使用ASP.NETMVC。我有一个父母: public class ReportFilterBuilderStruct { public string PropName { get; set; } public string ClassName { get; set; } public string SubListName { get; set; } //public virtual string SecondaryPropName { get; set;

我正在使用ASP.NETMVC。我有一个父母:

public class ReportFilterBuilderStruct
{
    public string PropName { get; set; }
    public string ClassName { get; set; }
    public string SubListName { get; set; }
    //public virtual string SecondaryPropName { get; set; }

    public ReportFilterBuilderStruct(string inpPropName, string inpClassName, string inpSubListName)
    {
        PropName = inpPropName;
        ClassName = inpClassName;
        SubListName = inpSubListName;
    }
}
还有一个孩子:

public class DateReportFilterBuilderStruct : ReportFilterBuilderStruct
{
    public string SecondaryPropName { get; set; }

    public DateReportFilterBuilderStruct(string inpPropName, string inpSecondaryPropName, string inpClassName, string inpSubListName) : base(inpPropName, inpClassName, inpSubListName)
    {
        SecondaryPropName = inpSecondaryPropName;
    }
}
}

它将在我的视图中用于存储有关模型类属性的一些数据。
editorListProp
将同时存储
ReportFilterBuilderStruct
DateReportFilterBuilderStruct
,这就是为什么它是父类对象的
列表

var editorListProp = new List<NTStock.Models.ReportFilterBuilderStruct>();
var editorListProp=new List();
现在我想访问它们:

if (subItem.GetType() == typeof(NTStock.Models.ReportFilterBuilderStruct))
{
    <div class="row align-items-center">
        @Html.DisplayName(subItem.PropName)
    </div>
    <div class="row align-items-center  mb-2">
        @Html.Editor(subItem.PropName, "", new { htmlAttributes = new { @class = subItem.ClassName } })
    </div>
}
else
{
    <div class="row align-items-center">
        @Html.DisplayName(subItem.PropName)
    </div>
    <div class="row align-items-center mb-2">
        <div class="col-6">
            From:
            @Html.Editor(subItem.PropName, "", new { htmlAttributes = new { @class = subItem.ClassName } })
        </div>
        <div class="col-6">
            Till:
            @Html.Editor(subItem.SecondaryPropName, "", new { htmlAttributes = new { @class = subItem.ClassName } })
        </div>
    </div>
}
if(subItem.GetType()==typeof(NTStock.Models.ReportFilterBuilderStruct))
{
@Html.DisplayName(子项.PropName)
@编辑器(subItem.PropName,“,new{htmlAttributes=new{@class=subItem.ClassName})
}
其他的
{
@Html.DisplayName(子项.PropName)
发件人:
@编辑器(subItem.PropName,“,new{htmlAttributes=new{@class=subItem.ClassName})
直至:
@编辑器(subItem.SecondaryPropName,“,new{htmlAttributes=new{@class=subItem.ClassName}})
}

因此,问题是,我无法访问我的
SecondaryPropName
,即使我确保当前
子项
的类型明确为
DateReportFilterBuilderStruct
,您必须将
子项
转换为
DateReportFilterBuilderStruct
,例如:

((DateReportFilterBuilderStruct)subItem).SecondaryPropName

您必须将
子项
转换为
DateReportFilterBuilderStruct
,例如:

((DateReportFilterBuilderStruct)subItem).SecondaryPropName

这种方法可以在动态类型语言(如Python)中使用,但在C#中不起作用。您的列表类型为
list
。当您从列表中访问一个项目时,例如
list[0]
,您会返回一个类型为
ReportFilterBuilderStruct
的对象,即使您在那里存储了
DateReportFilterBuilderStruct
,并且
GetType()
正确返回
DateReportFilterBuilderStruct

else
分支中,首先必须将项目强制转换为
DateReportFilterBuilderStruct

else
{
    @{ var dateReport = (DateReportFilterBuilderStruct)subItem; }
    <div class="row align-items-center">
        @Html.DisplayName(dateReport.PropName)
    </div>
    <div class="row align-items-center mb-2">
        <div class="col-6">
            From:
            @Html.Editor(dateReport.PropName, "", new { htmlAttributes = new { @class = dateReport.ClassName } })
        </div>
        <div class="col-6">
            Till:
            @Html.Editor(dateReport.SecondaryPropName, "", new { htmlAttributes = new { @class = dateReport.ClassName } })
        </div>
    </div>
}
else
{
@{var dateReport=(DateReportFilterBuilderStruct)子项;}
@Html.DisplayName(dateReport.PropName)
发件人:
@编辑器(dateReport.PropName,“,new{htmlAttributes=new{@class=dateReport.ClassName})
直至:
@编辑器(dateReport.SecondaryPropName,“,new{htmlAttributes=new{@class=dateReport.ClassName}})
}

这种方法可以在动态类型语言(如Python)中工作,但在C#中不行。您的列表类型为
list
。当您从列表中访问一个项目时,例如
list[0]
,您会返回一个类型为
ReportFilterBuilderStruct
的对象,即使您在那里存储了
DateReportFilterBuilderStruct
,并且
GetType()
正确返回
DateReportFilterBuilderStruct

else
分支中,首先必须将项目强制转换为
DateReportFilterBuilderStruct

else
{
    @{ var dateReport = (DateReportFilterBuilderStruct)subItem; }
    <div class="row align-items-center">
        @Html.DisplayName(dateReport.PropName)
    </div>
    <div class="row align-items-center mb-2">
        <div class="col-6">
            From:
            @Html.Editor(dateReport.PropName, "", new { htmlAttributes = new { @class = dateReport.ClassName } })
        </div>
        <div class="col-6">
            Till:
            @Html.Editor(dateReport.SecondaryPropName, "", new { htmlAttributes = new { @class = dateReport.ClassName } })
        </div>
    </div>
}
else
{
@{var dateReport=(DateReportFilterBuilderStruct)子项;}
@Html.DisplayName(dateReport.PropName)
发件人:
@编辑器(dateReport.PropName,“,new{htmlAttributes=new{@class=dateReport.ClassName})
直至:
@编辑器(dateReport.SecondaryPropName,“,new{htmlAttributes=new{@class=dateReport.ClassName}})
}

答案的第二部分不幸不正确,因为
is
将返回
true
,即使
子项
的类型为
DateReportFilterBuilderStruct
,因为它继承自
ReportFilterBuilderStruct
。答案的第二部分不幸不正确,因为
is
将返回
true
,即使
子项的类型为
DateReportFilterBuilderStruct
,因为它继承自
ReportFilterBuilderStruct