c#可选参数的最低要求

c#可选参数的最低要求,c#,attributes,integration-testing,optional-parameters,notnull,C#,Attributes,Integration Testing,Optional Parameters,Notnull,所以我试图得到两个表之间存在的关系列表,以验证一些集成测试。 数据库非常简单:表1表2 我想从Table1 ID列表或Table2 ID列表或两者中获取现有关系。 如果我说我的参数都是可选的,那么我需要验证这两个参数都不是null,如果是,则抛出异常。如果我强制这两个参数,并希望允许其中一个为null,但不允许两者都为null,那么我需要创建3个方法来处理它,或者强制将使用该方法在调用中添加null参数的开发人员,就像下面的代码一样,我认为这是一种丑陋的方法 遗憾的是,这不可能是多态性,因为第一

所以我试图得到两个表之间存在的关系列表,以验证一些集成测试。 数据库非常简单:表1表2 我想从Table1 ID列表或Table2 ID列表或两者中获取现有关系。 如果我说我的参数都是可选的,那么我需要验证这两个参数都不是null,如果是,则抛出异常。如果我强制这两个参数,并希望允许其中一个为null,但不允许两者都为null,那么我需要创建3个方法来处理它,或者强制将使用该方法在调用中添加null参数的开发人员,就像下面的代码一样,我认为这是一种丑陋的方法

遗憾的是,这不可能是多态性,因为第一个参数是相同的类型。。。 但是我想允许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
}
protected async Task method1(List table1Ids)=>method3(table1Ids,null);
受保护的异步任务方法2(列出Table2ID)=>method3(空,Table2ID);
受保护的异步任务方法3(列表Table1ID、列表Table2ID)
{
if(table1Ids==null&&table2Ids==null)
抛出新ArgumentNullException();
//代码在这里
}
老实说,我可以选择所有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();
}
[MinimumOptionalRequiredAttribute(1)]
受保护的异步任务GetRelationFromListOfIds(List table1Ids=null,
列表表2IDS=null){
//代码在这里
}
//可以使用的代码示例
{
//那就行了
var byTable1=GetRelationFromListOfIds(table1Ids);
var byTable2=GetRelationFromListOfIds(table2Ids:table2Ids);
var ByTable1和2=GetRelationFromListOfIds(table1Ids,table2Ids);
//这是c#intellisense不允许的
var throwException=GetRelationFromListOfIds();
}

我知道我正试图用一种方法解决所有问题,而不是用一种更“正常”的方法。我谈论属性,但它不一定是属性。如果尝试调用methodEmptyParamsNotAllow(),我希望代码不会编译。老实说,我甚至不确定这是否是提高代码可读性的好主意。我只是对这个想法很好奇。类似的东西已经存在了吗?这个主意好吗?它会是什么样子?

我怀疑这个论点应该有一些具体的用途。若我使用列表,我无法判断列表[0]是表1还是表2,除非我指定,但若我这样做,我应该使用列表。甚至可以使用Enum来说明列表在我的代码中的含义。但这将回到使用3方法来处理我希望允许的调用。这就是我想要自己处理的,我想有一种方法来生成所有可能的方法,这些方法都符合我给出的标准。如果我说我有10个可选参数,并且允许在调用中定义至少3个参数时使用该方法。这意味着我可能会有10^(10-3)版本?编辑:我认为它更像这样:X:可选参数;Y:所需的最小参数;方法的可能版本:X^(X-Y)