Как заставить типы DTO реализовать метод? - PullRequest
0 голосов
/ 24 марта 2020

Я хочу реализовать такой метод с C# 7.3, чтобы заставить некоторые объекты передачи данных соответствовать моей реализации:

    public List<T> QueryOnDb<T>(DateTime dateRef) where T : baseDTO
    {
        string param = T.getParam();
        List<string> resultJson = _context.Foo.Where(x=> x.type == param).Select(x=> x.json).ToList();
        return resultJson.Select(x => JsonConvert.DeserializeObject<T>(x)).ToList();
    }

Очевидно, что он не скомпилируется, потому что C# не support stati c abstract методы для абстрактного класса.

Первый обходной путь, который я попытался, - передать param в сигнатуру QueryOnDb, но я мог бы использовать T и param разные.

РЕДАКТИРОВАТЬ 1: добавлено упоминание о том, что getParam() должен быть абстрактным.

1 Ответ

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

Можно использовать Reflection так, чтобы вызов метода stati c в обобщенном классе c связывался с методом stati c с определенным именем в производном классе, если таковой существует, или используйте запрограммированное аварийное действие, если оно не существует. Невозможно заставить компилятор отклонять производные классы, которые не могут определить метод stati c с определенным именем, но это на самом деле не большая проблема, чем более широкая неспособность компиляторов отклонять классы, которые нарушают их требования наследования в большинстве другие способы.

Хотя Reflection имеет репутацию медленной, производительность может быть достаточно хорошей, если класс generi c использует делегат stati c для идентификации вызываемой функции. Этот делегат должен быть инициализирован функцией, которая будет использовать Reflection для поиска метода stati c в классе, заданном параметром generi c, и сохранения его в делегате. Затем будущие вызовы могут использовать этот делегат напрямую, без необходимости повторного поиска метода для этого конкретного класса generi c.

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