c# Минимум обязательных дополнительных параметров - PullRequest
2 голосов
/ 06 марта 2020

Итак, я пытаюсь получить список отношений, существующих между двумя таблицами, для проверки какого-либо интеграционного теста. База данных довольно проста: Table1 <- RelationTable -> Table2 Я хотел бы получить существующее отношение из списка идентификаторов Table1 или списка идентификаторов Table2 или обоих. Если я сказал, что все мои параметры необязательны, мне нужно убедиться, что оба значения не равны NULL, или, если это так, выдать исключение. Если я принудительно заставлю оба параметра и хочу, чтобы один или другой был нулевым, но не обоим, мне нужно создать 3 метода для его обработки или заставить разработчика, который будет использовать метод для добавления нулевого параметра в вызове, как в коде ниже что я думаю, что это ужасный способ сделать это.

К сожалению, это не может быть полиморфизмом, потому что первые параметры одного типа ... Но я бы хотел, чтобы methodX просто вызывал метод и позволял 3 возможных метода в один, не позволяя method () без параметров использовать.

protected async Task<List<Relation>> method1(List<string> table1Ids) => method3(table1Ids, null);
protected async Task<List<Relation>> method2(List<string> table2Ids) => method3(null, table2Ids);
protected async Task<List<Relation>> method3(List<string> table1Ids, List<string> table2Ids)
{
    if(table1Ids == null && table2Ids == null) 
        throw new ArgumentNullException();
    // code here
}

Если честно, я мог бы выбрать, если все null throw или 3 метода или для пуленепробиваемого кода выбирают оба, и это будет работать хорошо, но Я ищу альтернативную версию, где я могу указать как минимум один параметр, но не сказал, какой из них требуется. Я подумал, что, возможно, атрибут из. Net Framework сделает это для меня , но я не мог найти что-то рядом с этим. Я ищу что-то, что может сделать это из коробки или пользовательский атрибут, чтобы сделать это.

Это было бы что-то подобное. Без броска if, потому что атрибут подтвердил бы его.

[MinimumOptionalRequiredAttribute(1)]
protected async Task<List<Relation>> GetRelationFromListOfIds(List<string> table1Ids = null,
                                                              List<string> table2Ids = null) {
    // code here
}
// Example of code that could be use
{
    // Those would work
    var byTable1 = GetRelationFromListOfIds(table1Ids);
    var byTable2 = GetRelationFromListOfIds(table2Ids:table2Ids);
    var byTable1And2 = GetRelationFromListOfIds(table1Ids, table2Ids);

    // This would not be allow by the c# intellisense
    var throwException = GetRelationFromListOfIds();
}

Я знаю, что я пытаюсь решить все одним методом вместо того, чтобы идти более "нормальным" способом. Я говорю об атрибуте, но это не обязательно атрибут. Я ожидаю, что код не скомпилируется, если вы попытаетесь вызвать methodEmptyParamsNotAllow (). Если честно, я даже не уверен, что это хорошая идея для читабельности кода. Мне просто интересно об этой идее. Что-то подобное уже существует? Идея хороша? Как это будет выглядеть?

...