Перегрузка функций общим списком <T>проблема - PullRequest
0 голосов
/ 09 мая 2019

Привет, у меня в домене хранилища много дублирования кода, например:

public CommonModel GetLocations(IModelWithCurrentUser<xyz> model)
{
    var sqlParameters = SqlHelpers.GetReportSqlParameters(model);
    var outputParameters = new Dictionary<string, object>() { { "TotalCount", default(int) } };
    var result = _queryExecutor.QueryWithOutputParameters<Locations>(PermissionsQueries.GetLocations, sqlParameters, outputParameters);
    var totalCount = Convert.ToInt32(outputParameters["TotalCount"]);
    return RepositoryConverter.ToCommonDSModel(result, model.Content, totalCount);
}

Я пытался создать общий метод, подобный этому:

public CommonModel GetSqlReport<T>(IModelWithCurrentUser<xyz> model, string queryName)
{
    var sqlParameters = SqlHelpers.GetReportSqlParameters(model);
    var outputParameters = new Dictionary<string, object>() { { "TotalCount", default(int) } };
    var result = _queryExecutor.QueryWithOutputParameters<T>(queryName, sqlParameters, outputParameters);
    var totalCount = Convert.ToInt32(outputParameters["TotalCount"]);
    return RepositoryConverter.ToCommonDSModel(result, model.Content, totalCount);
}

Но, к сожалению, яво время компиляции кода возникла ошибка: невозможно преобразовать из 'System.Collections.Generic.List T' в 'System.Collections.Generic.List role' в методе

  return RepositoryConverter.ToCommonDSModel(result, model.Content, totalCount);

Метод RespoitoryConverter ToCommonDSModel перегружаетсяВот несколько примеров типа списка:

public static CommonModel ToCommonDSModel(List<Roles> data, xyz dtoModel, long itemsCount)
public static CommonModel ToCommonDSModel(List<Locations> data, xyz dtoModel, long itemsCount)
public static CommonModel ToCommonDSModel(List<abc> data, xyz dtoModel, long itemsCount)

Мой вопрос: как я могу удалить дублирование кода в моем домене хранилища?

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Хорошо, спасибо: D за действительно хороший кусок кода, но на другом форуме я нашел этот путь:

изменить

var result = _queryExecutor.QueryWithOutputParameters<T>(queryName, sqlParameters, outputParameters);

до

dynamic result = _queryExecutor.QueryWithOutputParameters<T>(queryName, sqlParameters, outputParameters);
0 голосов
/ 09 мая 2019

Вот, пожалуйста:

public CommonModel GetSqlReport<T>(IModelWithCurrentUser<xyz> model, string queryName)
{
    var sqlParameters = SqlHelpers.GetReportSqlParameters(model);
    var outputParameters = new Dictionary<string, object>() { { "TotalCount", default(int) } };
    var result = _queryExecutor.QueryWithOutputParameters<T>(queryName, sqlParameters, outputParameters);
    var totalCount = Convert.ToInt32(outputParameters["TotalCount"]);
    return RepositoryConverter.ToCommonDSModel<T>(result, model.Content, totalCount);
}

public static class RepositoryConverter
{
    private static Dictionary<Type, Delegate> __map = new Dictionary<Type, Delegate>()
    {
        { typeof(Roles), (Func<List<Roles>, xyz, long, CommonModel>)ToCommonDSModel },
        { typeof(Locations), (Func<List<Locations>, xyz, long, CommonModel>)ToCommonDSModel },
        { typeof(abc), (Func<List<abc>, xyz, long, CommonModel>)ToCommonDSModel },
    }
    public static CommonModel ToCommonDSModel<T>(List<T> data, xyz dtoModel, long itemsCount)
        => ((Func<List<T>, xyz, long, CommonModel>)__map[typeof(T)])(data, dtoModel, itemsCount);

    public static CommonModel ToCommonDSModel(List<Roles> data, xyz dtoModel, long itemsCount) => /* implementation here */;
    public static CommonModel ToCommonDSModel(List<Locations> data, xyz dtoModel, long itemsCount) => /* implementation here */;
    public static CommonModel ToCommonDSModel(List<abc> data, xyz dtoModel, long itemsCount) => /* implementation here */;
}

Секретный соус заключается в использовании Dictionary<Type, Delegate> для хранения функций различных типов, которые вы извлекаете на основе универсального типа T.

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