【问题标题】:Simplify method overloads where T is int or List<int>简化 T 为 int 或 List<int> 的方法重载
【发布时间】: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 方法真的没有代码质量提升吗?
  • 即使是简化这一点的建议仍然过于复杂。应该有一个重载接受字符串列表和整数列表。如果调用者希望只提供一个值,那么这些列表中可能只有一个项目。不需要更多的重载,不需要可能是也可能不是不同事物的复杂类型。列表已经可以像任何其他数字一样轻松地表示单个值。

标签: c# generics


【解决方案1】:

经验法则:

public class SomeMethodArguments
{
   public List<int> WhateverYouWant {get;set;}
}

public void SomeMethod(SomeMethodArguments args);

看起来不错。映射到其他参数。灵活的。质量不错。老实说,在大多数情况下,泛型看起来像垃圾。

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 2012-11-24
    • 2013-02-17
    • 1970-01-01
    • 2013-07-29
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多