2017-11-01 7 views
0

私はASP.NET MVCを使用しています。私は親を持つ:с#親コレクションの項目から子プロパティを取得

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は、ReportFilterBuilderStructDateReportFilterBuilderStructの両方を格納するため、親クラスオブジェクトのListです。

var editorListProp = new List<NTStock.Models.ReportFilterBuilderStruct>(); 

今、私はそれらにアクセスしたい:

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> 
} 

だから、ポイントは、私は現在のsubItemがdefinetlyタイプDateReportFilterBuilderStructのあることを確かめたにも関わらず、私は私のSecondaryPropNameにアクセス傾けること、です。

答えて

2

次の例のように、DateReportFilterBuilderStructsubItemをキャストする必要があります。

((DateReportFilterBuilderStruct)subItem).SecondaryPropName 
+0

'is'でも'サブアイテム場合 'true'をを返しますので、答えの2番目の部分は、残念ながら事実ではありません'は、' ReportFilterBuilderStruct'から継承するので、 'DateReportFilterBuilderStruct'型です。 –

1

このアプローチは、Pythonのような動的型付け言語ではなく、C#で動作します。リストのタイプはList<ReportFilterBuilderStruct>です。リストから項目にアクセスすると、たとえばlist[0]の場合、DateReportFilterBuilderStructを保存していてもGetType()が正しくDateReportFilterBuilderStructを返しても、タイプReportFilterBuilderStructのオブジェクトが返されます。

あなたが最初DateReportFilterBuilderStructに項目をキャストする必要がありますelseブランチで:

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> 
} 
関連する問題