C #에서 사용자 지정 특성을 만드는 방법
나는 많은 시간을 시도했지만 여전히 커스텀 속성의 사용법을 이해할 수 없습니다 (이미 많은 링크를 겪었습니다).
누구나 코드가있는 사용자 정의 속성의 매우 기본적인 예를 설명해 주시겠습니까?
사용자 정의 속성 을 작성하는 코드 는 매우 단순하지만 다음과 같은 속성을 이해하는 것이 매우 중요합니다.
속성은 프로그램으로 컴파일 된 메타 데이터입니다. 속성 자체는 클래스, 속성 또는 모듈에 기능을 추가하지 않고 데이터 만 제공합니다. 그러나 리플렉션을 사용하면 기능을 만들기 위해 이러한 특성을 활용할 수 있습니다.
예를 들어, Microsoft의 Enterprise Library 에서 Validation Application Block을 살펴 보자 . 코드 예제를 보면 다음을 볼 수 있습니다.
/// <summary>
/// blah blah code.
/// </summary>
[DataMember]
[StringLengthValidator(8, RangeBoundaryType.Inclusive, 8, RangeBoundaryType.Inclusive, MessageTemplate = "\"{1}\" must always have \"{4}\" characters.")]
public string Code { get; set; }
위의 스 니펫에서 유효성 검사기 규칙에 따라 코드가 변경 될 때마다 코드의 유효성이 항상 검사 될 것입니다 (예 : 8 자 이상 8 자 이상). 그러나 진실은 속성이 아무 것도하지 않는다는 것입니다. 앞에서 언급했듯이 메타 데이터 만 속성에 추가합니다.
그러나 엔터프라이즈 라이브러리에는 Validation.Validate
개체를 살펴볼 수 있는 메서드 가 있으며 각 속성에 대해 내용이 특성에 의해 알려진 규칙을 위반하는지 확인합니다.
따라서 속성에 대해 생각해야하는 방식입니다. 나중에 다른 메소드 / 클래스 등에서 사용할 수있는 코드에 데이터를 추가하는 방법입니다.
Attribute 에서 파생 된 클래스를 작성하여 시작합니다 .
public class MyCustomAttribute: Attribute
{
public string SomeProperty { get; set; }
}
그런 다음이 속성으로 무엇이든 (클래스, 메소드, 속성 등)을 꾸밀 수 있습니다.
[MyCustomAttribute(SomeProperty = "foo bar")]
public class Foo
{
}
마지막으로 리플렉션을 사용하여 가져옵니다.
var customAttributes = (MyCustomAttribute[])typeof(Foo).GetCustomAttributes(typeof(MyCustomAttribute), true);
if (customAttributes.Length > 0)
{
var myAttribute = customAttributes[0];
string value = myAttribute.SomeProperty;
// TODO: Do something with the value
}
AttributeUsage 속성을 사용하여이 사용자 정의 속성을 적용 할 수있는 대상 유형을 제한 할 수 있습니다 .
/// <summary>
/// This attribute can only be applied to classes
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class MyCustomAttribute : Attribute
속성에 대해 알아야 할 중요한 사항 :
- 속성은 메타 데이터입니다.
- 컴파일 타임에 어셈블리에 구워지며 속성을 설정하는 방법에 매우 심각한 영향을 미칩니다. 상수 (컴파일 타임에 알려진) 값만 허용됩니다
- 사용자 정의 속성을 이해하고 사용하는 유일한 방법은 Reflection 을 사용하는 것 입니다. 따라서 런타임에 리플렉션을 사용하여 가져 오지 않고 사용자 정의 속성으로 무언가를 장식하지 않으면 많은 일이 일어날 것으로 기대하지 않습니다.
- 속성 생성 시간은 비 결정적입니다. 그것들은 CLR에 의해 인스턴스화되며 당신은 그것을 제어 할 수 없습니다.
Darin Dimitrov의 훌륭한 응답을 활용 / 복사 하는 방법은 클래스가 아닌 속성의 사용자 정의 속성에 액세스하는 방법입니다.
[클래스의 Foo
] 장식 된 재산 :
[MyCustomAttribute(SomeProperty = "This is a custom property")]
public string MyProperty { get; set; }
가져 오는 중 :
PropertyInfo propertyInfo = typeof(Foo).GetProperty(propertyToCheck);
object[] attribute = propertyInfo.GetCustomAttributes(typeof(MyCustomAttribute), true);
if (attribute.Length > 0)
{
MyCustomAttribute myAttribute = (MyCustomAttribute)attribute[0];
string propertyValue = myAttribute.SomeProperty;
}
이것을 루프에 던지고 리플렉션을 사용 하여 class의 각 속성 에서이 사용자 정의 속성에 액세스 할 수 Foo
있습니다.
foreach (PropertyInfo propertyInfo in Foo.GetType().GetProperties())
{
string propertyName = propertyInfo.Name;
object[] attribute = propertyInfo.GetCustomAttributes(typeof(MyCustomAttribute), true);
// Just in case you have a property without this annotation
if (attribute.Length > 0)
{
MyCustomAttribute myAttribute = (MyCustomAttribute)attribute[0];
string propertyValue = myAttribute.SomeProperty;
// TODO: whatever you need with this propertyValue
}
}
감사합니다, 대린 !!
참고URL : https://stackoverflow.com/questions/4879521/how-to-create-a-custom-attribute-in-c-sharp
'Programming' 카테고리의 다른 글
iOS로 이미지 크기를 쉽게 조정하고 최적화하는 방법은 무엇입니까? (0) | 2020.07.29 |
---|---|
PHP 용으로 예쁜 글씨가 있습니까? (0) | 2020.07.29 |
자바 스크립트는 키 값을 기준으로 배열에서 객체를 찾고 제거합니다. (0) | 2020.07.29 |
호스트 네트워크를 시작할 수 없습니다 (0) | 2020.07.29 |
요세미티와 발 그린 (0) | 2020.07.29 |