我正在尝试使用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 引擎的文档。