2013-01-11 36 views

回答

1

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

  1. 您可以检查哪些属性的getter/setter方法是读/分配哪个字段(只有一个字段)

  2. 您可以在字段和属性的名称定义图案(例如每场名称的前缀是两个字符,属性对应于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 } 

虽然第二条规则可能会错过一些积极的,第一条规则将返回许多假阳性。也许我们可以写出两者的混合体(名称上有一个模式,如属性名称包含部分字段名称)。

enter image description here