使用下面这个简单的例子:
void SomeMethod(int varA, string varB) {}
void SomeMethod(List<int> varA, string varB) {}
void SomeMethod(int varA, List<string> varB) {}
void SomeMethod(List<int> varA, List<string> varB) {}
这个会在n*n中增长,我觉得一定有更好的方法。我的一个想法是使其通用,如下面的
void SomeMethod<T1,T2>(T1 varA, T2 varB)
where T1 in { int, List<int> }
where T2 in { string, List<string> }
{
if(varA is int intA)
//do int actions
else
//do List<int> actions
//...
}
我发现了一个类似的问题(c#泛型-我可以让T来自两个选项之一吗?),但是那里的答案不适用于这里
有什么想法吗?
编辑:为了简单起见,我在这里简化,目标是检查参数是一个值还是一个值的集合,如果它是一个简单的值,变成一个具有单个值的集合,并将其传递给另一个需要集合的重载,@charlieface在评论中有这个想法,但它需要多个参数,其中每个都可以是简单的值T或T的集合。
一个js工作的例子,我假装在c#下面实现
var nonArrayToArray = (someValue) => Array.isArray(someValue) ?
someValue : [someValue];
var doSomething = (valueCanBeListOnObject, valueCanBeListOnObject2,
valueCanBeListOnObject3) => {
const guaranteedList = nonArrayToArray(valueCanBeListOnObject);
const guaranteedList2 = nonArrayToArray(valueCanBeListOnObject2);
const guaranteedList3 = nonArrayToArray(valueCanBeListOnObject3);
doSomethingOverload(guaranteedList, guaranteedList2, guaranteedList3);
}
var doSomethingOverload = (guaranteedList, guaranteedList2, guaranteedList3) => {
[...guaranteedList, ...guaranteedList2, ...guaranteedList3].forEach(v => console.log(v))
}
doSomething('someString',['someString'],1);
经验法则:
public class SomeMethodArguments
{
public List<int> WhateverYouWant {get;set;}
}
public void SomeMethod(SomeMethodArguments args);
看起来不错。映射到其他参数。灵活。好的质量。老实说,在大多数情况下,泛型看起来就像垃圾。