编写StyleCop自定义规则教程(二)---校验规则增加配置参数

上一篇教程编写StyleCop自定义规则教程(一)---编写中文备注的简单校验规则 中使用的例子是校验代码中所有属性,不区分Public、Internal等。本文沿用原有例子增加两个规则的属性(IncludePublic和InculdeInternal),规则根据这两个属性的开关值,控制是否检查代码中访问权限是Public或Internal的代码。

 

在规则的xml文件中加入Properties节点

 

ExpandedBlockStart.gif View Code
< Properties >
    
< BooleanProperty
      
Name ="IncludePublic"
      DefaultValue
="True"
      FriendlyName
="包括Pulbic"
      Description
="代码分析时检验Public属性"
    
/>
    
< BooleanProperty
      
Name ="IncludeInternal"
      DefaultValue
="True"
      FriendlyName
="包括Internal"
      Description
="代码分析时检验Internal属性"
    
/>     
  
</ Properties >

 

CsDocument 类重载了多个WalkDocument方法,上一篇教程使用的是
WalkDocument(CodeWalkerElementVisitor<object> elementCallback,object context); 最后一个参数传入了空值,本文需要传入属性校验的开关值。因此使用void WalkDocument<T>(CodeWalkerElementVisitor<T> elementCallback, T context),定义一个结构体传入用户配置的值。
ExpandedBlockStart.gif View Code
[StructLayout(LayoutKind.Sequential)]
        
private   struct  AnalyzerSettings
        {
            
public   bool  IncludePublic;
            
public   bool  IncludeInternal;
        }

private  AnalyzerSettings LoadSettings(CodeDocument document)
        {
            AnalyzerSettings result 
=   new  AnalyzerSettings();
            result.IncludeInternal 
=   true ;
            result.IncludePublic 
=   true ;

            
if  (document.Settings  !=   null )
            {
                BooleanProperty addInSetting 
=  document.Settings.GetAddInSetting( this " IncludePublic " as  BooleanProperty;
                
if  (addInSetting  !=   null )
                {
                    result.IncludePublic 
=  addInSetting.Value;
                }

                addInSetting 
=  document.Settings.GetAddInSetting( this " IncludeInternal " as  BooleanProperty;
                
if  (addInSetting  !=   null )
                {
                    result.IncludeInternal 
=  addInSetting.Value;
                }
            }

            
return  result;
        }

 

修改规则子类必须重写的AnalyzeDocument方法

ExpandedBlockStart.gif View Code
public   override   void  AnalyzeDocument(CodeDocument document)
        {
            Param.RequireNotNull(document, 
" document " );
            CsDocument document2 
=  (CsDocument)document;
            
if  ((document2.RootElement  !=   null &&   ! document2.RootElement.Generated)
            {
                AnalyzerSettings settings 
=  LoadSettings(document);

                document2.WalkDocument
< AnalyzerSettings > ( new  CodeWalkerElementVisitor < AnalyzerSettings > ( this .CheckDocumentationForElement), settings);
            }
        }

 

原有的CheckDocumentationForElement方法最后一个参数就是传入的配置值,方法根据代码节点的类型和访问权限进行校验

ExpandedBlockStart.gif View Code
private   bool  CheckDocumentationForElement(CsElement element, CsElement parentElement, AnalyzerSettings settings)
        {
            
if  ( base .Cancel)
            {
                
return   false ;
            }

            
if  ( ! element.Generated)
            {
                
if  ((element.ElementType  ==  ElementType.Property)  &&
                ((settings.IncludePublic 
&&  element.AccessModifier  ==  AccessModifierType.Public)  ||
                   (settings.IncludeInternal 
&&  element.AccessModifier  ==  AccessModifierType.Internal)))
                {
                    
this .ParseHeader(element, element.Header, element.LineNumber,  false );
                }
            }
            
return   true ;
        }

 

 编译后将dll放到stylecop目录,在stylecop settings中选中新的规则,可以在右侧Detailed settings中看到规则的两个开关值。

 

代码: /Files/Byeah/WithSettingRule.zip

转载于:https://www.cnblogs.com/Byeah/archive/2011/06/29/2093420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值