【发布时间】:2021-10-18 00:08:14
【问题描述】:
使用这个简单的例子:
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# generics - Can I make T be from one of two choices?),但这里的答案并不适用
有什么想法吗?
编辑:为了简单起见,我在这里进行了简化,目的是检查参数是一个值还是一个值的集合,如果它是一个简单的值,则变成一个具有单个值的集合并传递它对于另一个需要集合的重载,cmets 中的@charlieface 有这个想法,但它需要多个参数,其中每个参数可以是简单的值 T 或 T 的集合。
下面我假装在 c# 中实现的 js 工作示例
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);
【问题讨论】:
-
处理int和List
得到的区别是什么?您可以将所有整数视为单个项目列表吗?如果不是,那么这些方法不应该是单独的方法吗,因为您处理每种类型的变量的方式太不同了? -
如果你要写 n * n
if...else分支,为什么不写 n * n 方法呢?还是参数相互独立,只需要n个if...elses? -
请提供现实生活中的例子!
-
tbh,这看起来已经很臭了...为什么参数以这些格式出现...您将如何在泛型方法中处理它们?模式匹配?类型检查?...编写 n*n 方法真的没有代码质量提升吗?
-
即使是简化这一点的建议仍然过于复杂。应该有一个重载接受字符串列表和整数列表。如果调用者希望只提供一个值,那么这些列表中可能只有一个项目。不需要更多的重载,不需要可能是也可能不是不同事物的复杂类型。列表已经可以像任何其他数字一样轻松地表示单个值。