次のような C# コードがあります (クラス ファイル = Status.cs):
/// <summary>
/// Constructs a status entity with the text specified
/// </summary>
/// <param name="someParameter">Some parameter.</param>
public Status(string someParameter)
{
SomeProperty = someParameter;
}
/// <summary>
/// An example of a virtual property.
/// </summary>
public virtual string SomeProperty { get; private set; }
そして、私はそれに3つのことをしたい:
- その上で「バッキングフィールドを持つプロパティへ」Resharperを実行します
- 「プライベート セット」を取り除き、通常の「セット」に置き換えます
- プロパティの代わりにプライベート フィールドを初期化するようにコンストラクタを変更します。
したがって、最終結果は次のようになります。
/// <summary>
/// Constructs a status entity with the text specified
/// </summary>
/// <param name="someParameter">Some parameter.</param>
public Status(string someParameter)
{
_someProperty = someParameter;
}
private string _someProperty;
/// <summary>
/// An example of a virtual property.
/// </summary>
public virtual string SomeProperty
{
get { return _someProperty; }
set { _someProperty = value; }
}
そして私の質問は、たとえば Resharper API を使用して、このタイプのリファクタリングを自動化する方法はありますか?
バックグラウンド:
なぜ私がこれをしたいのか不思議に思うかもしれませんが、それは次の理由によるものです。
NHibernate (old=2.1.2.4000, new=3.3.1.4000) と Fluent NHibernate (old=1.1.0.685, new=1.3.0.0) をアップグレードしています。
古い NHibernate.ByteCode.Castle.dll と構成ファイル内の対応する行を削除したので、最新の NHibernate に組み込まれている既定のプロキシを使用できるようになりました。
NHibernate の新しい実装と Fluent の新しいバージョンの間には、単体テストをビルドして実行しようとすると、2 つの問題があるようです (これの一部は FxCop の不満ですが、とにかく):
a) 「プライベート セット」が原因で例外がスローされ、b) コンストラクターで仮想プロパティが初期化されているために例外がスローされます。
そのため、これらの変更を行うと、コンパイルされ、単体テストに合格することがわかりました。
1 つまたは 2 つのクラスについては問題ありませんが、800 を超えるクラス ファイルがあり、プロパティの数は誰にもわかりません。
これを行う方法はたくさんあると思います (リフレクションの使用、ディレクトリの再帰、ファイルの解析など) が、Resharper はこのようなものに適したツールのようです。
助けていただければ幸いです, ありがとう, -デイブ
--「保護されたセットに変更するだけで完了です」という回答への応答:
残念ながら、それはそれほど単純ではありません。
単体テストの実行時に発生するエラーは次のとおりです (クラスに変更を加える前)。
テスト メソッドが例外をスローしました: NHibernate.InvalidProxyTypeException: 次の型はプロキシとして使用できません: .Status: メソッド set_StatusText は 'public/protected virtual' または 'protected internal virtual' である必要があります..仮想」または「保護された内部仮想」
したがって、提案どおりにクラスを変更すると (唯一の変更は「プライベート セット」を「保護セット」に変更することです)、プロジェクトはビルドされません。
エラー 2 CA2214: Microsoft.Usage: 'Status.Status(string, StatusLocation)' には、クラスによって定義された仮想メソッドを呼び出す呼び出しチェーンが含まれています。意図しない結果については、次のコール スタックを確認してください。 Status..ctor(String, StatusLocation) Status.set_Location(StatusLocation):Void C:\\Status.cs 28
そのため、これらの仮想プロパティの 1 つを初期化するコンストラクター内のステートメントも変更する必要があります。
NHibernate プロキシ (ByteCode.Castle) の以前の実装は、「プライベート セット」を気にしていないようでしたが、これは気にします。
そして、確かに、2 番目のエラーは FxCop が原因であり、クラスに属性を配置して、FxCop にこれについて文句を言わないように指示することもできますが、それは問題を解決するだけのようであり、コンストラクターで仮想プロパティを初期化することは、私が理解しているように、とにかく悪い習慣です。
だから私の質問はまだ立っています。最初に説明した変更は、私が行いたい変更です。これらの変更を自動化するにはどうすればよいですか?