自動プロパティ (public Foo { get; set; }) に変換できるカスタム プライベート変数に対してプロパティを記述した古いコードがあります。どうすればこれを検出できますか?
1 に答える
1
このようなルールを作成するには、対応するプロパティ アクセサーとフィールドを結合する必要があります。続行するには2つの方法を想像できます。
どのプロパティ getter/setter がどのフィールドを読み取り/割り当てているかを確認できます (1 つのフィールドのみ)。
フィールドとプロパティの名前にパターンを定義できます (たとえば、すべてのフィールド名には 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 }
2 番目のルールは次のようになります。
// <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 }
2 番目のルールは陽性を見逃す可能性がありますが、最初のルールは多くの誤検知を返します。たぶん、2 つを組み合わせて書くこともできます (プロパティ名のような名前のパターンには部分的にフィールド名が含まれます)。
于 2013-01-13T07:48:21.663 に答える