【问题标题】:NDepend detect properties with can be automaticNDepend 检测属性可以是自动的
【发布时间】:2013-01-11 21:57:35
【问题描述】:

我们有旧代码,人们针对自定义私有变量编写属性,这些变量可以变成自动属性(public Foo { get; set; })。我怎样才能检测到这个?

【问题讨论】:

    标签: ndepend


    【解决方案1】:

    要编写这样的规则,您需要以某种方式加入相应的属性访问器和字段。我可以想象两种方法:

    1. 您可以检查哪个属性 getter/setter 正在读取/分配哪个字段(只有一个字段)

    2. 您可以在字段和属性的名称上定义模式(例如每个字段名称都以两个字符为前缀,Foo 属性对应于 m_Foo 字段)

    第一条规则可能如下所示:

    // <Name>Use Automatic Property</Name>
    warnif count > 0 
    from t in Application.Types
    
    from f in t.Fields
    where !f.Name.Contains('<') // Eliminate generated by compiler fields
    
    let getter = (from m in t.Methods
    where m.IsPropertyGetter &&
          m.FieldsReadButNotAssigned.Contains(f) &&
          m.FieldsUsed.Count() == 1
    select m)
    
    let setter = (from m in t.Methods
    where m.IsPropertySetter &&
          m.FieldsAssigned.Contains(f) &&
          m.FieldsUsed.Count() == 1
    select m)
    
    where getter.Count() > 0 || setter.Count() > 0
    
    select new { f, getter, setter }
    

    第二条规则可能如下所示:

    // <Name>Use Automatic Property</Name>
    warnif count > 0 
    from t in Application.Types
    
    from f in t.Fields
    where !f.Name.Contains('<') // Eliminate generated by compiler fields
    
    // Here we consider that field name is prefixed with two any characters
    where f.Name.Length > 2
    let name = f.Name.Substring(2, f.Name.Length -2)
    
    let getter = (from m in t.Methods
    where m.IsPropertyGetter &&
          m.SimpleName == "get_" + name
    select m).SingleOrDefault()
    
    let setter = (from m in t.Methods
    where m.IsPropertySetter &&
          m.SimpleName == "set_" + name
    select m).SingleOrDefault()
    
    where getter != null || setter != null
    
    select new { f, getter, setter }
    

    虽然第二条规则可能会漏掉一些阳性结果,但第一条规则会返回许多误报。也许我们可以混合编写两者(在名称上使用模式,例如属性名称包含部分字段名称)。

    【讨论】:

      猜你喜欢
      • 2022-01-17
      • 2013-07-03
      • 1970-01-01
      • 2011-06-08
      • 1970-01-01
      • 2011-10-30
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多