有没有更好的方法来编写一个接受多种类型的C#函数
本文关键字:一个 类型 函数 种类 方法 更好 有没有 | 更新日期: 2023-09-27 18:19:47
一些上下文:我想写一个类,其中向集合添加内容的主要方法是通过一个或多个名为Add的方法(或类似的方法)。因此,看起来最好的签名是params对象[]。在内部,这个函数必须切换它可以接受的所有类型。因此,最初它可以接受这个object[]数组,但我可能希望它也接受object[][]和object[][][][]等,然后方法/函数可以在内部展开,因此用户在调用该函数之前不需要这样做。
所以。。。
是否可以为一种对象编写一个可以接受各种级别列表类型的函数作为一个附带问题,在设计类的接口时,接受(编辑:从问题中删除,因为已经有足够的内容了。)object[]
、IEnumerable<object>
或params object[]
哪个更好
例如,我正在考虑一个同时/全部接受object[]
、IEumerable<object>
的函数,以及可能的进一步嵌套,如:IEnumerable<IEnumerable<object>>
、object[][]
(以及on、on和on等)。
这可能吗?
您会注意到List<T>
类本身具有采用T的方法Add和采用T序列的方法AddRange。我们不试图重载Add来同时执行这两个操作,原因有两个。首先,因为添加一个东西和添加一堆东西在逻辑上是不同的,其次,因为这会使过载解决变得非常复杂。
如果你想要一个取T序列的方法,那么写一个取T序列的方法。如果调用者有一个序列,让他们把它压平;不要试图代表他们猜测如何有效地做到这一点。
接受
object[]
、IEnumerable<object>
和params object[]
哪个更好?
我们究竟该怎么知道?我们不是调用该方法的人。你应该询问的人是将要编写代码来调用你的方法的人。
一个选项只是生成一个函数,然后根据需要多次重载它。您可以使重载的函数调用"base"函数。
DoWork(params object[] args)
{
//do the actual work
}
DoWork(IEnumerable<object> args)
{
DoWork(args.ToArray());
}
//etc etc
这实际上取决于列表类型的含义。如果您的意思是明确的,那么您可以有一个接受IList<T>
的方法。如果您想将数组放入混合中,那么您实际上应该接受IEnumerable<T>
。除非您需要修改它,否则在这种情况下,数组将无法真正工作,因此您可以接受ICollection<T>
。
对一个函数进行两个重载,一个重载接受IEnumerable<T>
,另一个重载接收params T[]
。通过调用前者来实现后者。忘记嵌套,LINQ可以使用SelectMany
轻松地展平集合。