Programming

C #에서 사용자 지정 특성을 만드는 방법

procodes 2020. 7. 29. 22:19
반응형

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

반응형