以前は気付かなかった C# メソッド解決の機能に出くわしました。つまり、セッターをサポートするインターフェイスを明示的に実装し、暗黙的なインターフェイスが保護されたセットのみを提供する場合、コンパイラーは保護されたセットを呼び出すときに賢明に延期します。したがって、自動実装されたプロパティの利便性を最大限に活用できますが、フィールドを変更してはならないクライアントによるフィールドの偶発的な変更を防ぐことができます。
例として、
virtual public DateTime CreatedOn { get; protected set; }
virtual public DateTime? ModifiedOn { get; protected set; }
#region IHaveUpdateDateFields Members
DateTime IHaveUpdateDateFields.CreatedOn
{
get
{
return this.CreatedOn;
}
set
{
this.CreatedOn = value;
}
}
DateTime? IHaveUpdateDateFields.ModifiedOn
{
get
{
return this.ModifiedOn;
}
set
{
this.ModifiedOn = value;
}
}
次に、モデル バインディング コードが誤って日付を設定することはありませんが、ORM イベント リスナーは IHaveUpdateDateFields を実装するエンティティをチェックし、エンティティを永続化するときに日付を設定できます。
私の質問は次のとおりです。
- 定義された動作に依存していますか?それとも、すべての C# コンパイラがこの方法でメソッドを解決することが保証されていますか? C# の標準では、この種のメソッド解決は未定義であり、Mono 用にビルドするときに誤って恐ろしいスタック オーバーフローが発生することを発見したくありません。
- これを行うためのより良い(理想的には簡潔な)方法はありますか?コントローラーに渡す ModelBinder セーフ インターフェイスを使用することもできますが、それによってコードが節約されるとは思えず、プロパティの偶発的な変更を最小限に抑えるための透過的なアプローチが提供されるとは思えません。