0

比較的簡単なクラス階層を実装しようとしています。しかし、私の知識の一部は学校以来失われているようです. 問題は、サブクラスのプロパティが検索時に失われることです.

階層は次のとおりです。

  • サブクラスに関する一般的なプロパティを持つ抽象クラス
  • 特定のプロパティを持つサブクラス。抽象クラスから継承
  • サブクラスのコレクション

コレクション

public class ActiveFilters
{
    public List<ActiveFilter> Filters { get; set; }
    enum FilterTypes 
    { 
        DateRange = 1,
        CheckBox = 2,
        TextBox = 3,
        RadioButtons = 4
    };

    public ActiveFilters()
    {
        Filters = new List<ActiveFilter>();

        //Required filters on start
        Filters.Add(
            new FilterDateRange(
                "/statistikstart.aspx",
                (int)FilterTypes.DateRange,
                "paymentDate",
                new DateTime(1800, 1, 1),
                DateTime.Now.AddDays(7)
            )
        );
        Filters.Add(
            new FilterDateRange(
                "/statistikgiro.aspx",
                (int)FilterTypes.DateRange,
                "paymentDate",
                new DateTime(1800, 1, 1),
                DateTime.Now
            )
        );
    }

    public ActiveFilter GetActiveFilter(string source, string name)
    {
        try
        {
            return Filters.FirstOrDefault(x => x.Source == source && x.Name == name) as ActiveFilter;
        }
        catch
        {
            //Filter not in collection
            return null;
        }
    }
}

抽象クラス

public abstract class ActiveFilter
{
    public string Source { get; set; }
    public int Type { get; set; }
    public string Name { get; set; }
}

サブクラス

public class FilterDateRange : ActiveFilter
{
    public DateTime FromDate { get; set; }
    public DateTime ToDate { get; set; }

    public FilterDateRange(string source, int type, string name, DateTime fromDate, DateTime toDate)
    {
        base.Source = source;
        base.Type = type;
        base.Name = name;
        this.FromDate = FromDate;
        this.ToDate = ToDate;
    }
}

作成されたフィルターの 1 つをコレクション コンストラクターから取得しようとすると、サブクラスから日付が保存されません。保存される唯一の情報は、抽象クラスのプロパティです。

FilterDateRange test = ((FilterDateRange)((ActiveFilters)Session["activeFilters"]).GetActiveFilter("/statistikstart.aspx", "paymentDate"));

サブクラスではなく GetActiveFilter() から ActiveFilter を返すのは問題ですか? もしそうなら、フィルターが異なるサブクラスである可能性がある場合、GetActiveFilter() を書き直してフィルターを返すにはどうすればよいですか?

4

1 に答える 1