의 속성을 실수로 수정하는 것을 방지했습니다. 이전에는 알지 못했던 C# 메서드 해결 기능을 발견했습니다. 즉, 내가 setter를 지원하는 인터페이스를 명시 적으로 구현하고 암시 적 인터페이스가 보호 된 세트만을 제공하면 컴파일러는이를 호출 할 때 보호 된 세트를 현명하게 연기합니다. 따라서 자동 구현 된 속성의 편리함을 최대한 활용할 수 있지만 변경하지 않아야하는 클라이언트가 실수로 필드를 수정하는 것을 방지 할 수 있습니다. 예를 들어 명시 적 인터페이스를 사용하여 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 안전 인터페이스를 가질 수는 있지만 코드를 저장하지 않는 것처럼 보이고 속성의 실수로 인한 수정을 최소화하는 투명성있는 접근 방식을 제공하지 않을 것이라고 생각합니다.
네, 저의 목표입니다 ... 대부분의 OO 구조와 마찬가지로 사기가 아니라 실수를 막기 위해 노력하고 있습니다. protected set idiom은 우리 시스템의 ID에 사용되고, 물론 NHibernate는 리플렉션을 사용하여 작동합니다. – JasonTrue