Как динамически установить значения свойств C1, C2, ..., Cn в моем классе по их порядковым номерам? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть SQL Таблица сервера, в которой есть столбец bit для каждого дня года, начиная с 1 - 366. Мне нужно установить bit на 1, если dayofyear находится в списке для праздники или в списке на выходные. В моем коде имена столбцов были изменены с [1] .. [366] на [C1] .. [C366].

List<int> holidays = new List<int>();

List<int> weekends = ListWeekends(year);

HolidayRecords Hrecords = new HolidayRecords();
Hrecords.Program = Program;
Hrecords.Currency = Currency;

HolidayRecords.Add(db, Hrecords);
db.SaveChanges();

Мне нужно будет l oop пройти по всем столбцам и установить их на false перед обработкой каждого списка, но я не уверен, как это сделать. не говоря уже о l oop через каждый список и установить соответствующий столбец на true.

1 Ответ

1 голос
/ 20 марта 2020

Reflection можно использовать для решения этой проблемы. Следующий метод использует Reflection для перебора выходных и праздничных дней и установки соответствующих Cx свойств в значение true:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;

public static void FillHolidayRecords(HolidayRecords hr, List<int> holidays, List<int> weekends)
{ 
    Type type = hr.GetType();

    foreach (int day in holidays.Concat(weekends).Distinct())
    {
        // Get Cx property by day number.
        PropertyInfo pi = type.GetProperty($"C{day}");
        // Set value of the property to true.
        pi.SetValue(hr, true);
    }
}

В этом методе предполагается, что по умолчанию свойства Cx равны false.


Мне нужно будет l oop через все столбцы и установить их в False, прежде чем я обработаю каждый список

Если вы объявите каждый из Cx свойства как autoproperty без установки его значений явно, чем значения этих Cx свойств будут false. И вам не нужно будет устанавливать их на false в l oop.

public class HolidayRecords
{ 
    // By default if you don't set value of C1 in the constructor
    // its value is false.
    public bool C1 { get; set; }
    ...
}

public void Sample()
{
    HolidayRecords hr = new HolidayRecords();
    // Here the value of hr.C1 is false.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...