0

自動プロパティ (public Foo { get; set; }) に変換できるカスタム プライベート変数に対してプロパティを記述した古いコードがあります。どうすればこれを検出できますか?

4

1 に答える 1

1

このようなルールを作成するには、対応するプロパティ アクセサーとフィールドを結合する必要があります。続行するには2つの方法を想像できます。

  1. どのプロパティ getter/setter がどのフィールドを読み取り/割り当てているかを確認できます (1 つのフィールドのみ)。

  2. フィールドとプロパティの名前にパターンを定義できます (たとえば、すべてのフィールド名には 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 に答える