0

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

4

1 回答 1

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 }

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

在此处输入图像描述

于 2013-01-13T07:48:21.663 回答