C#从父集合的项中获取子属性
我正在使用ASP.NETMVC。我有一个父母: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;
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
。