Как разрешить вызов нескольких разных IList через метод - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть метод, который требует определения IList при вызове.Однако он прекрасно работает, так как проект расширяется, мы постоянно копируем / вставляем код и меняем тип списка, так как они поступают из моделей.Есть ли простой способ, не определяя его как динамический, упростить процесс, чтобы мы могли просто повторно использовать этот метод?

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

private int ReportDataWriter(ExcelWorksheet worksheet, IList<ReportGridColumnModel> headerColumns, IList<CoolModel> modelData, int rowIndex) 
{
    var dataHeaderCount = headerColumns.Count();
    var totalItems = modelData.Count;
    var lineIndex = rowIndex;

    for (var i = 0; i < totalItems; i++) 
    {
        var colIndex = 1;
        foreach (var dataHeader in headerColumns) 
        {
            worksheet.DataWriter(dataHeader, rowIndex, colIndex, colIndex);
            using (var cell = worksheet.Cells[rowIndex, colIndex++]) 
            {
                var valueToWrite = GetColumnValue(dataHeader.Field, modelData[i]);
                cell.Value = valueToWrite;

                worksheet.Column(colIndex - 1).AutoFit();

                if (modelData[i].IsCatRow) 
                {
                    worksheet.SetBackGroundColor(ExcelFillStyle.Solid, Color.LightGray, rowIndex,
                        dataHeaderCount, 1);
                }
            }
        }
        rowIndex++;
    }

    if (modelData[0].CategoryTitle == ReportConstants.Total) 
    {
        worksheet.SetBottomBorder(ExcelBorderStyle.Thin, Color.Black, lineIndex, dataHeaderCount, 1);
    }

    return rowIndex;
}

1 Ответ

0 голосов
/ 20 декабря 2018

Вы можете сделать его универсальным с ограничениями на универсальные типы.

public int DataWriter<THeader, TModel>(ExcelWorksheet worksheet, IList<THeader> headerColumns, IList<TModel> modelData, int rowIndex) 
    where THeader: IHeader 
    where TModel: IModel 
{
    var dataHeaderCount = headerColumns.Count();
    var totalItems = modelData.Count;
    var lineIndex = rowIndex;
    for (var i = 0; i < totalItems; i++) 
    {
        var colIndex = 1;
        foreach (var dataHeader in headerColumns) {
            worksheet.DataWriter(dataHeader, rowIndex, colIndex, colIndex);
            using (var cell = worksheet.Cells[rowIndex, colIndex++]) {
                var valueToWrite = GetColumnValue(dataHeader.Field, modelData[i]);
                cell.Value = valueToWrite;

                worksheet.Column(colIndex - 1).AutoFit();

                if (modelData[i].IsCatRow) {
                    worksheet.SetBackGroundColor(ExcelFillStyle.Solid, Color.LightGray, rowIndex,
                        dataHeaderCount, 1);
                }

            }
        }
        rowIndex++;
    }
    if (modelData[0].CategoryTitle == ReportConstants.Total) {
        worksheet.SetBottomBorder(ExcelBorderStyle.Thin, Color.Black, lineIndex, dataHeaderCount, 1);
    }
    return rowIndex;
}

Интерфейсы

public interface IHeader
{
    string Field { get; }
}
public interface IModel
{
    string CategoryTitle { get; }
    bool IsCatRow { get; }
}

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

Пример использования:

var headers = new List<ReportGridColumnModel>();
var models = new List<CoolModel>();
var worksheet = new ExcelWorksheet();

var r = DataWriter(worksheet, headers, models);

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

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