如何重载一个方法来支持params数组和IEnumerable,但将IEnumeraable始终解释为IEnumeral



我编写了这个重载方法,允许调用者传递他/她想要的任何东西(IEnumerable、List、HashSet、Ts数组,还有多个T值-逗号分隔(:

public void Values<T>(IEnumerable<T> ts)
{
Test(ts);
}
public void Values<T>(params T[] ts)
{
Test(ts);
}
private void Test<T>(IEnumerable<T> ts)
{
// I expect this method to receive an IEnumerable with at least 2
// elements in it.
}

我没有想到的是:调用Values(new List<string> {"a", "b"})实际上调用了第二个方法,而不是第一个方法我想,那是因为params数组比IEnumerable旧

这种情况下的问题是:我的第二个方法使用包含列表的数组调用另一个方法。这不是我的本意。

如果我删除第一个方法,我将无法传递哈希集。如果我删除第二个方法,我将无法传递逗号分隔的值。

解决这一困境的正确方法是什么?

  1. 如果传递了一个值,并且它实现了IEnumerable,那么我想将其值传递给Test((方法
  2. 如果传递了一个值,但它没有实现IEnumerable,那么我想将IEnumeraable或数组中的该值传递给Test((方法
  3. 如果传递了多个值,那么我想将这些值传递给Test((方法

我尝试了通用约束和丑陋的反射代码,但没有找到任何解决方案。

添加AsEnumerable(),或者显式指定泛型的类型。您将得到一个对所需方法重载的调用。

var list = new List<int>();
Values(list); // params
Values(list.AsEnumerable()); // IEnumerable
Values<int>(list); // IEnumerable

最新更新