Programing

속성 생성자에 객체를 전달하는 방법

lottogame 2021. 1. 8. 07:44
반응형

속성 생성자에 객체를 전달하는 방법


다음과 같이 Attributes 생성자에 개체를 전달하려고합니다.

[PropertyValidation(new NullOrEmptyValidatorScheme())]
public string Name { get; private set; }

이 속성 생성자를 사용하면 :

 public PropertyValidationAttribute(IValidatorScheme validator) {
      this._ValidatorScheme = validator;
    }

코드가 컴파일되지 않습니다. 위와 같이 객체를 속성에 어떻게 전달할 수 있습니까?

편집 : 예 NullOrEmptyValidatorScheme은 IValidatorScheme을 구현합니다.

오류 : 오류 CS0182 : 특성 인수는 상수 식, typeof 식 또는 특성 매개 변수 유형의 배열 생성 식이어야합니다.


속성 값은 단순 유형으로 제한됩니다. 예를 들어, 기본 상수 (문자열 포함) 및 typeof... new또는 다른 더 복잡한 코드를 사용할 수 없습니다 . 간단히 말해서 당신은 이것을 할 수 없습니다. 그래도 유형을 지정할 수 있습니다 .

[PropertyValidation(typeof(NullOrEmptyValidatorScheme)]

즉, PropertyValidationctor에이 소요 Type및 사용 Activator.CreateInstance코드 내부 개체를 만들 수 있습니다. 이상적으로는 문자열을 내부에 저장해야합니다 ( AssemblyQualifiedName).

ECMA 334v4에서 :

§24.1.3 특성 매개 변수 유형

속성 클래스에 대한 위치 및 명명 된 매개 변수의 유형은 다음과 같은 속성 매개 변수 유형으로 제한됩니다 .

  • 다음 유형 중 하나 : bool, byte, char, double, float, int, long, short, string.
  • 유형 object.
  • 유형 System.Type.
  • 공개 액세스 가능성이 있고 중첩 된 유형 (있는 경우)에도 공개 액세스 가능성이있는 열거 형 유형입니다.
  • 위 유형의 1 차원 배열.

§24.2 속성 사양

...

E다음 명령문이 모두 참인 경우 표현식 은 attribute-argument-expression입니다.

  • 유형은 E특성 매개 변수 유형 (§24.1.3)입니다.
  • 컴파일 타임에 E 값은 다음 중 하나로 해석 될 수 있습니다.
    • 상수 값.
    • 제네릭이 아닌 형식, 폐쇄 형 생성 형식 (§25.5.2) 또는 바인딩되지 않은 제네릭 형식 (§25.5)을 지정하는 식 형식 (§14.5.11).
    • attribute-argument-expression의 1 차원 배열입니다.

이전 포스터에서 언급했듯이 특성 인수에 사용되는 형식은 매우 엄격하게 제한됩니다 (그 값을 어셈블리 메타 데이터 Blob에 직접 직렬화해야하기 때문에 이해할 수 있음).

즉 당신은 아마 활용하는 솔루션을 만들 수 있습니다 말했다 typeofs을 사람들은 같이 할 수 사용될 수.

예 :

[PropertyValidation(typeof(NullOrEmptyValidatorScheme))]
public string Name { get; private set; }

이 구문은 완벽하게 합법적입니다. 속성을 읽는 코드는 유효성 검사기 유형을 가져 와서 유효성 검사기의 새 인스턴스를 만든 다음 (적절한 경우 유효성 검사기 유형에 키가 지정된 유효성 검사기 캐시를 유지할 수도 있습니다. 이것은 상당히 일반적인 기술입니다) 호출해야합니다. .


또한 ... (마이크로 소프트 버그라고 생각합니다)

기본값을 "null"로 설정할 수 없지만 기본 단순 기본값은 괜찮습니다 ( 'false', '7', ' "Test").

NExt 예제에서는 다음과 같은 오류가 발생합니다. 속성 인수는
파일에서 속성 매개 변수 유형의 상수 표현식, typeof 표현식 또는 배열 생성 표현식이어야 합니다. ... \ CSC

public class SampleAttribute : Attribute
{
    private string _test;
    public SampleAttribute(string test = null)
    {
        _test = test;
    }
}

[Sample]
public class Toto
{

}

참조 URL : https://stackoverflow.com/questions/1235617/how-to-pass-objects-into-an-attribute-constructor

반응형