C#使用IList和IReadOnlyList重载解析

前端之家收集整理的这篇文章主要介绍了C#使用IList和IReadOnlyList重载解析前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个方法,我想在我的解决方案中采取所有类似列表的对象.在.NET 4.5之前,这很简单:
  1. public static T Method<T>(IList<T> list)
  2. {
  3. // elided
  4. }

但是,.NET 4.5引入了IReadOnlyList< T>,该方法也应该适用于此.

我不能仅仅改变签名以获取IReadOnlyList< T>,因为有些地方我将该方法应用于特定类型为IList< T>的东西.

该算法不能在IEnumerable< T>上运行,并且它太频繁地使用(并且具有太大的对象)以获取IEnumerable< T>.并创建一个新列表< T>每次通话.

我试过添加一个重载:

  1. public static T Method<T>(IReadOnlyList<T> list)
  2. {
  3. // elided
  4. }

…但是这不会编译实现两个接口(T [],List< T>和许多其他类型)的任何东西,因为编译器无法确定使用哪种方法(特别烦人,因为它们具有相同的身体,所以没关系).

我不想添加带有T []和List< T>的Method的重载,以及实现这两个接口的所有其他类型.

我该怎么做到这一点?

解决方法

这可能是实际检查运行时类型有用的场合之一:
  1. public static T Method<T>(IEnumerable<T> source)
  2. {
  3. if (source is IList<T> list)
  4. return Method(list);
  5.  
  6. if (source is IReadOnlyList<T> readOnly)
  7. return Method(readOnly);
  8.  
  9. return Method(source.ToList() as IList<T>);
  10. }
  11.  
  12. private static T Method<T>(IReadOnlyList<T> list) { ... }
  13. private static T Method<T>(IList<T> list) { ... }

您仍需要复制代码,因为您需要为IList和IReadOnlyList单独实现,因为您没有可以利用的通用接口,但至少可以避免出现模糊的呼叫问题.

猜你在找的C#相关文章