문제

TextBox Class를 상속하는 클래스가 있습니다. MyTextBox라고합니다.

이 클래스의 기본 Background 값을 재정의하고 싶습니다.

그래서 나는 그렇게하는 방법을 찾고 좋은 옵션을 찾았습니다 : call BackgroundProperty.OverrideMetadata()

문제 : 이것을 어디에 둘 수 있습니까?

App.OnStartup()에? 추악하고 실용적이지 않습니다. 클래스 코드 파일에 포함하고 싶습니다.

수업의 작성자? 예외가 발생합니다. <인용구>

PropertyMetadata가 이미 등록되었습니다. 'MyTextBox'유형의 경우

(괜찮아 보이지만 왜이게 완벽하게 나오는지 이해합니다)

그래서 C #의 정적 생성자에 대한 발견을 다시 찾았습니다 (이전에는 그런 것이 아닙니다. 아쉽습니다)

다음은 내 코드입니다. 라코 디스

이제 나는 이것에 대해 꽤 행복하지만 Microsoft는 그렇지 않습니다. 즉, 코드 분석 기능을 사용하면 다음과 같은 결과가 나타납니다.

CA1810 : 참조 유형 정적 필드 인라인 초기화

그러므로 내 질문 : 어떻게해야합니까?

  • 경고를 무시 하시겠습니까? >> 경고를 무시하고 싶지 않습니다.
  • 호출을 overrideMetadata 메소드로 이동 하시겠습니까? >>하고 싶은데 어디?

    모든 힌트를 환영합니다. 감사합니다.

    편집 : 정적 생성자에서 어떤 것도 초기화하지 않기 때문에이 경고가 표시되는 이유를 완전히 이해하지 못함을 추가하겠습니다. 그렇지 않습니까?

도움이 되었습니까?

해결책

다음은 에 대한 메타 데이터 재정의에 대한 MSDN의 종속성 속성 :

설명 : "속성 속성에 대한 메타 데이터 재정의는 속성 시스템에서 해당 속성을 사용하기 전에 수행해야합니다 (이는 속성을 등록하는 개체의 특정 인스턴스가 인스턴스화되는 시간과 동일 함). OverrideMetadata에 대한 호출은 정적 내에서 수행되어야합니다. OverrideMetadata의 forType 매개 변수로 자신을 제공하는 유형의 생성자입니다. "

경고를 억제 할시기에 대한 CA1810에 게시 한 링크의 문구 :

경고를 억제해야하는 경우

CA1810 성능이 문제가되지 않는 경우이 규칙에서 경고를 표시하지 않는 것이 안전합니다. 또는 정적 초기화로 인한 전역 상태 변경이 비싸거나 유형의 정적 메서드가 호출되거나 유형의 인스턴스가 생성되기 전에 발생하도록 보장해야하는 경우

따라서 현재 구현 및 경고 억제가 올바른 경로 일 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top