如何使用List <t>()隐藏私有字段?

时间:2018-08-16 14:41:43

标签: c# wpf linq oop properties

我创建了一个DatesClass,从中获取Date数据,该数据存储在使用{{1}的Microsoft SQL Server localdb数据库中的字符串中(由于某种原因-我知道我刚可以使用DateTime)。 }:

System.Data.Linq.Mapping

(我将它们全部设为私有,因为我不希望任何人都在包括我在内的班级之外直接访问它们)

但是,我列出了一个将它们全部封装的列表。像这样:

[Column(CanBeNull = false)]
private string FirstDate { get; set; } = string.Empty;

[Column(CanBeNull = false)]
private string SecondDate { get; set; } = string.Empty;

[Column(CanBeNull = false)]
private string ThirdDate { get; set; } = string.Empty;

然后制定了一种将日期添加到列表的方法:

private List<DateTime> _dates;

public List<DateTime> Dates {
    get {
        var f    = DateTime.TryParse(FirstDate,  out var first);
        var s    = DateTime.TryParse(SecondDate, out var second);
        var t    = DateTime.TryParse(ThirdDate,  out var third);
        var list = new List<DateTime>();
        if (f) list.Add(first);
        if (s) list.Add(second);
        if (t) list.Add(third);
        if (_dates != null) return list;
        _dates = list;
        return list;
    }
    private set {
        FirstDate  = value[0].ToShortDateString();
        SecondDate = value[1].ToShortDateString();
        ThirdDate  = value[2].ToShortDateString();
    }
}

然后保存所有内容:

public void AddDate(DateTime date) {
    if (_dates == null) // this was added because some parts of `Dates` getter didn't work for some reason
        _dates = Dates;

    if (_dates.Count == 3)
        throw new ManyDatesException(); // custom exception

    if (_dates.Contains(date))
        return;

    _dates.Add(date);
}

然后我将通过WPF中的各种事件和按钮来进行逻辑处理:

public void SaveDates() {
    // this saves data of `_dates` to the private fields using the setter of `Dates`
    Dates = _dates;
}

但是我遇到了一系列严重问题,其中一些是:

  • 点击事件多次触发(已经取消订阅并订阅了点击事件)
  • 即使获得了公共private void AddDates_Click(object sender, RoutedEventArgs e) { var date = IDatePicker.SelectedDate ?? IDatePicker.DisplayDate; var datesClass = DatesProvider.GetDatesClass(1); var anotherDatesClass = DatesProvider.GetDatesClass(2); if (datesClass.Dates.Contains(date)) { Debug.Show(new DateAlreadyExistException()); // custom function for showing exception messages return; } try { datesClass.AddMonth(date); } catch (ManyDatesException ex) { Debug.Show(ex); return; } // save everything to the actual database } 列表并据此在其中设置了私有Date_dates仍然为空且未分配。
  • 以某种方式,当首次触发click事件并在_dates中分配_dates时,它不会继续进行方法AddDate(DateTime date)的其余部分,而是在{{1} }已经分配。

这真令人沮丧,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为问题的部分原因在于您试图协调3个私有字段和一个私有列表,并且有时列表或一个字段被更新而另一个不被更新。

根据您的评论和共享的代码,似乎并不需要真正的List<DateTime> _dates。听起来您只需要具有3个私有属性(我想是为了进行数据绑定?),您想将它们显示为列表,并想提供一种添加日期的方法。

如果这都是真的,那么您应该可以封装字段,而无需在幕后添加实际的私有列表:

public class DatesClass
{
    [Column(CanBeNull = false)]
    private string FirstDate { get; set; } = string.Empty;

    [Column(CanBeNull = false)]
    private string SecondDate { get; set; } = string.Empty;

    [Column(CanBeNull = false)]
    private string ThirdDate { get; set; } = string.Empty;

    public List<DateTime> Dates
    {
        get
        {
            var dates = new List<DateTime>();
            DateTime temp;
            if (DateTime.TryParse(FirstDate, out temp)) dates.Add(temp);
            if (DateTime.TryParse(SecondDate, out temp)) dates.Add(temp);
            if (DateTime.TryParse(ThirdDate, out temp)) dates.Add(temp);
            return dates;
        }
    }

    public void AddDate(DateTime date)
    {
        if (Dates.Contains(date)) return;

        if (string.IsNullOrEmpty(FirstDate)) FirstDate = date.ToShortDateString();
        else if(string.IsNullOrEmpty(SecondDate)) SecondDate = date.ToShortDateString();
        else if(string.IsNullOrEmpty(ThirdDate)) ThirdDate = date.ToShortDateString();
        else throw new ManyDatesException();
    }
}