C #에서 특성을 사용하는 방법

특성은 어셈블리에 메타 데이터 정보를 추가 할 수있는 C # 프로그래밍 언어의 강력한 기능입니다.

속성은 실제로 Assembly, Class, Method, Delegate, Enum, Event, Field, Interface, Property 및 Struct와 같은 요소와 관련된 개체입니다. 선언적 정보를 연결하는 데 사용할 수 있습니다. 리플렉션을 사용해야하는 경우 나중에 런타임에 이러한 정보를 검색 할 수 있습니다. 즉, 리플렉션을 사용하여 필요한 경우 런타임에 쿼리 할 수있는 어셈블리에 추가 정보를 주입하기 위해 특성을 사용할 수 있습니다. 속성은 이름과 선택적으로 매개 변수 목록으로 구성됩니다. 속성 이름은 속성 클래스에 해당합니다.

속성을 활용하여 애플리케이션에서 비즈니스 오브젝트의 유효성을 검증 할 수 있습니다. 속성에는 내장 속성과 사용자 지정 속성의 두 가지 유형이 있습니다. 전자는 .Net 프레임 워크의 일부로 사용할 수 있지만 후자는 System.Attribute 클래스에서 클래스를 파생하여 구현할 수 있습니다. MSDN은 "속성은 선언에 지정된 추가 선언 정보의 일부입니다."라고 말합니다.

이제 몇 가지 코드를 살펴 보겠습니다. Obsolete 속성은 더 이상 필요하지 않거나 다른 대안이있을 수 있으므로 더 이상 사용해서는 안되는 메서드를 구식으로 표시하는 데 사용할 수 있습니다. 다음 코드 조각은 메서드 선언 위에 Obsolete 속성을 사용하는 방법을 보여줍니다.

[Obsolete("This method is obsolete...")]

        public static void DoSomeWork()

        {

            //Some code

        }

코드에서이 메서드를 사용하고 프로그램을 컴파일하면 Visual Studio IDE의 출력 창에 경고가 표시됩니다. 따라서 원하는 경우이 경고를 무시할 수 있습니다. 이제 개발자가이 방법을 전혀 사용하지 않도록하려면 어떻게해야합니까? 그런 다음 Obsolete 속성을 선언하는 동안 두 번째 매개 변수 (선택 사항)를 사용할 수 있습니다. 다음은 DoSomeWork () 메서드의 수정 된 버전입니다. 이번에는 Boolean 매개 변수의 사용법에 주목하십시오.

[Obsolete("This method is obsolete...", true)]

        public static void DoSomeWork()

        {

                       //Some code

        }                                                                                                                        

이번에 두 번째 선택적 매개 변수로 "true"를 전달하고 프로그램을 컴파일하면 코드가 전혀 컴파일되지 않습니다. 그게 당신이하고 싶었던 거죠?

맞춤 속성

이 섹션에서는 사용자 지정 속성을 구현하는 방법을 살펴 봅니다. 사용자 지정 특성은 System.Attribute 클래스를 상속하는 클래스입니다. 따라서 사용자 지정 특성 클래스를 구현하려면 다음과 같이 새 클래스를 만들고 System.Attribute 클래스에서 파생합니다.

using System;

public class CustomAttribute : Attribute

{

}

사용자 지정 특성의 사용을 제어하기 위해 AttributeUsage 클래스를 활용할 수 있습니다. 이 클래스에는 사용자 지정 특성의 사용을 제어하는 ​​데 사용할 수있는 ValidOn, AllowMultiple 및 Inherited와 같은 속성이 포함되어 있습니다.

다음 코드 스 니펫은 사용자 정의 속성 클래스의 수정 된 버전을 보여줍니다. 문자열을 인수로 받아들이고이를 클래스의 전용 문자열 멤버에 할당하는 생성자의 사용법에 유의하십시오. 이것은 단지 설명을위한 것입니다.

[AttributeUsage(AttributeTargets.All)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

사용자 지정 속성을 적용해야하는 속성 대상을 지정할 수도 있습니다. 방법은 다음과 같습니다.

[AttributeUsage(AttributeTargets.Class |

AttributeTargets.Constructor |

AttributeTargets.Field |

AttributeTargets.Method |

AttributeTargets.Property,

AllowMultiple = true)]

    public class CustomAttribute : Attribute

    {

        private string text;

        public CustomAttribute(string text)

        {

            this.Text = text;

        }

        public string Text

        {

            get

            {

                return this.text;

            }

            set

            {

                this.text = value;

            }

        }

    }

이제 리플렉션을 사용하여 다음 코드 조각을 사용하여 특정 개체에 적용되는 모든 속성을 표시 할 수 있습니다.

MemberInfo memberInfo = typeof(CustomAttribute);

object[] attributes = memberInfo.GetCustomAttributes(true);

for (int i = 0, j = attributes.Length; i < j; i++)

  {

     Console.WriteLine(attributes[i]);

  }

이제 사용자 정의 속성을 적용 할 다음 클래스를 고려하십시오.

[CustomAttribute("Hello World...")]

public class SomeClass

{

}

사용자 정의 속성이 어떻게 사용되었으며 텍스트가 인수로 전달되었는지 확인하십시오. 다음 코드 조각은 Text 속성의 내용을 인쇄하는 방법을 보여줍니다.

MemberInfo memberInfo = typeof(SomeClass);

object[] attributes = memberInfo.GetCustomAttributes(true);

foreach (object attribute in attributes)

{

CustomAttribute customAttribute = attribute as CustomAttribute;

if (customAttribute != null)

Console.WriteLine("Text = {0}", customAttribute.Text);

else

Console.WriteLine();

}