FxCop警告CA1006有什么好的解决方法吗?
我遇到了FxCop警告CA1006 ,Microsoft.Design“DoNotNestGenericTypesInMemberSignatures”的问题。 具体来说,我正在设计一个inheritance自ReadOnlyCollection<Report>
的ReportCollection
类,其public
构造函数将IList<Report>
作为参数。
修复此警告的建议不是很有用:
“要修复违反此规则的行为,请更改设计以删除嵌套类型参数。” 到目前为止,我可以通过两种方式来改变设计:
- 使构造函数
internal
。 这在我的情况下不起作用。 构造函数必须是public
因为此集合类需要通过程序集外部的代码进行实例化。 - 使构造函数采用
Report[]
而不是IList<Report>
。 这是次优的,因为外部代码应该具有使用动态大小的数据结构(如List
而不是固定大小的数组)的灵活性。
此时,我放弃并压制了这个警告。 有更好的解决方案吗?
我同意,另一个忽略这条规则的好时机是你需要说:
Func>
当然你可以使用非通用IEnumerable,但只要它实现IEnumerable(非generics),就可以使用任何类型。 generics(部分)的目的是限制对给定类型集合可授予的类型。
我认为这个规则非常愚蠢。 如果您有多个嵌套的generics类型,则只需要它。 一层筑巢不仅安全。
顺便说一句,我认为很多LINQ函数也嵌套了generics类型,所以如果MS这样做,我们也可以:)
我会接受FxCop的警告,好像它们是来自极度肛门保留的同事的建议。 忽略(压制)它建议的一些事情是完全可以的。
我同意您可以忽略CA1006警告
Func>
您还可以使用委托来简化代码并避免使用CA1006:
public delegate IEnumerable ChildrenDel ( T parent); // was: GetDescendants ( this T item, Func< T, IEnumerable< T > > children ) public static IEnumerable< T > GetDescendants ( this T item, ChildrenDel children ) { var stack = new Stack< T >(); do { children( item ).ForEach( stack.Push ); if( stack.Count == 0 ) break; item = stack.Pop(); yield return item; } while( true ); }