Перечислить свойства класса в C # - PullRequest
3 голосов
/ 26 марта 2010

У меня есть класс, похожий на этот

 public class Model
{
    public TimeSpan Time1 {get; set;}
    public TimeSpan Time2 { get; set; }
    public TimeSpan Time3 { get; set; }
    public TimeSpan Time4 { get; set; }

}

Теперь давайте представим, что мне нужно заполнить время во время выполнения, а затем вычислить время, оставшееся между временем 1 и временем 2, затем, когда это пройдет, найти время, оставшееся между временем 2 и временем 3 и так далее. Однако мне нужно учитывать, сколько сейчас времени.

Например:

Сейчас 13:00

Время 1 = 5:00 утра Время 2 = 12:00 вечера Время 3 = 16:00 Время 4 = 18:00

Так что, поскольку время составляет 1:00 вечера, мне нужно найти разницу между временем 2 и временем 3

Теперь есть ли более умный способ, чем рефлексия, чтобы определить это? Должен ли я добавить что-то в моем классе

Ответы [ 6 ]

7 голосов
/ 26 марта 2010

Если вам нужно сохранить существующую структуру вашего класса, вы можете добавить метод для перечисления во времени:

public class Model
{
    public TimeSpan Time1 {get; set;}
    public TimeSpan Time2 { get; set; }
    public TimeSpan Time3 { get; set; }
    public TimeSpan Time4 { get; set; }

    public IEnumerable<TimeSpan> GetTimes()
    {
        yield return Time1;
        yield return Time2;
        yield return Time3;
        yield return Time4;
    }
}

И используйте это так:

foreach (TimeSpan time in model.GetTimes())
{
    // use the TimeSpan
}
3 голосов
/ 26 марта 2010

Почему бы вам не использовать массив или список?

public class Model
{
    public List<DateTime> Dates { get; set; }
}
1 голос
/ 26 марта 2010

Если я правильно понимаю ваш вопрос, почему бы не иметь Dictionary<TimeSpan, string>, где ключ является действительным TimeSpan, а значением является имя, например "Time1"? Таким образом, вы можете отсортировать ключи, найти нужную пару, а затем получить их имена.

0 голосов
/ 26 марта 2010

Создание массива обеспечивает простой оператор linq для вычисления промежутка времени:

public class Model
{
    public TimeSpan Time1 { get; set; }
    public TimeSpan Time2 { get; set; }
    public TimeSpan Time3 { get; set; }
    public TimeSpan Time4 { get; set; }

    public TimeSpan GetSpan(TimeSpan time)
    {
        var times = new[] { Time1, Time2, Time3, Time4 };

        return Enumerable.Range(1, times.Length - 1)
            .Select(i => new[] { times[i - 1], times[i] })
            .Where(t => t[0] <= time && time < t[1])
            .Select(t => t[1] - t[0])
            .FirstOrDefault();
    }
}
0 голосов
/ 26 марта 2010

Это не проверено и требует некоторой оптимизации, но в качестве примера для примера используйте массив и выполните его итерацию.

public class Model
{
    private TimeSpan[] _timeSpans = new TimeSpan[4] { new TimeSpan(), new TimeSpan(), new TimeSpan(), new TimeSpan() };

    public TimeSpan Time1
    {
        get { return _timeSpans[0]; }
        set { _timeSpans[0] = value; }
    }
    public TimeSpan Time2
    {
        get { return _timeSpans[1]; }
        set { _timeSpans[1] = value; }
    }
    public TimeSpan Time3
    {
        get { return _timeSpans[2]; }
        set { _timeSpans[2] = value; }
    }
    public TimeSpan Time4
    {
        get { return _timeSpans[3]; }
        set { _timeSpans[3] = value; }
    }

    // DateTime.TimeOfDay holds the time portion of a time
    public TimeSpan GetDifference(TimeSpan currentTime)
    {
        int start = -1;
        for(int i = 0; i<_timeSpans.Length;i++)
        {
            if(_timeSpans[i] >= currentTime)
            {
                start = i;
                break;
            }
        }
        if(start == -1) throw new ArgumentException("handle the case where currentTime is smaller than all of them");
        int end = (start + 1 < _timeSpans.Length) ? start + 1 : 0;
        return _timeSpans[end] - _timeSpans[start];
    }
0 голосов
/ 26 марта 2010

Вы можете добавить свойство или метод, который будет возвращать время в виде списка для упрощения обработки. Тогда ваш внешний код может получить доступ ко времени в виде списка или отдельных свойств. Вы по-прежнему должны явно обращаться к каждому свойству, но, по крайней мере, оно принадлежит одному и тому же классу, поэтому вы не будете так тесно связывать свой внешний код со структурой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...