我正试图使用VisitMethodCall
覆盖实现我自己版本的CA2241。
如果String.Format的参数数量为5个或更少,它就会工作,但如果有6个或更多的参数(包括格式字符串),它总是只显示2个参数。
例如,(MethodCall)call.Operands.Count
在以下情况下是正确的:
Console.WriteLine( String.Format( "{0} {1}", 1, 2 ) );
Console.WriteLine( String.Format( "{0} {1} {2}", 1, 2, 3 ) );
但在这种情况下总是只返回"2":
Console.WriteLine( String.Format( "{0} {1} {2} {3}", 1, 2, 3, 4 ) );
Console.WriteLine( String.Format( "{0} {1} {2} {3} {4}", 1, 2, 3, 4, 5 ) );
这是我对VisitMethodCall
的缩写当前覆盖。当expression.NodeType
不是Literal
或Call
时,它总是只有两个参数的Pop
。只有当String.Format
的自变量数量为6或更多时,才会出现这种情况。
public override void VisitMethodCall( MethodCall call )
{
MemberBinding mb = call.Callee as MemberBinding;
if ( mb.BoundMember.FullName.StartsWith( "System.String.Format(" ) )
{
Expression expression = call.Operands[ 0 ];
switch ( expression.NodeType )
{
case NodeType.Literal:
// ...
break;
case NodeType.Call:
// ...
break;
default: // always NodeType.Pop with two parameters
// ...
break;
}
}
base.VisitMethodCall( call );
}
那么,我做错了什么?此外,CA2241规则的来源是否可用?
提前谢谢。
编辑:我发现了这篇文章:http://blogs.msdn.com/b/codeanalysis/archive/2010/04/14/data-flow-analysis-rules-in-visual-studio-2010.aspx这就解释了CC2241是使用新的数据流分析引擎(Pheonix)重新实现的,我确实能够用dotPeek找到这个方法。不幸的是,我找不到关于新DFA引擎的文档。
当超过3个替换值时,您只看到两个操作数的原因是目标正在调用String.Format的Format(string format, params object[] args)
重载。如果您想知道传递了多少个替换值,则需要检查args
参数数组的大小。
Microsoft提供的FxCop规则没有可用的源代码,也没有可用的规则SDK。如果你想了解它们是如何构建的,你需要使用反编译器(就像其他编写自定义规则的人一样)。