속성 생성자에 객체를 전달하는 방법
다음과 같이 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)]
즉, PropertyValidation
ctor에이 소요 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
'Programing' 카테고리의 다른 글
열거 형 이름이 Java로 인턴됩니까? (0) | 2021.01.08 |
---|---|
HTML 테이블을 Div로 바꾸기 (0) | 2021.01.08 |
Exploded Development는 무엇을 의미합니까? (0) | 2021.01.08 |
Unix의 pthread.h를 Windows에서 컴파일 할 수 있습니까? (0) | 2021.01.08 |
대표단, 왜? (0) | 2021.01.08 |