2013-01-11 75 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