Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

닷넷!스킬업

닷넷 기술을 조금 더 깊이 다루고자 합니다. 특정 주제를 정하지 않고 이슈 발생 시 마다 체계적으로 정리하여 공유하겠습니다. 이전 자료를 옮겨온 곳이기도 합니다.

[Attribute] - 사용자정의 Attribute (만들기)

작성자 : 박종명
최초 작성일 : 2008-05-30 (금요일)
최종 수정일 : 2008-05-30 (금요일)
조회 수 : 2572

실제 사용자 정의 어트리뷰트를 만들어 보자.
앞서 말했듯이 사용자 정의 어트리뷰트를 규칙에 맞도록 만드는 것은 쉽다.
 
실제로 중요한 것은 사용자 정의 어트리뷰트의 목적과 디자인일 것이다.

그리고 사용자 정의 어트리뷰트를 만들고 난 후 실제 어셈블리의 확장을 위해 어트리뷰트를 검사하는 과정도 필수 이다. 사용자 정의 어트리뷰트는 결국 어셈블리의 프로그래밍적 확장을 제공 하는데 어떤 element 에 어떤 어트리뷰트가 선언되었는지 알아 내는 과정이 필수일 것이다.

물론, 닷넷 내장 어트리뷰트 같은 경우에는 이런 검사과정과 확장 적용은 닷넷 프레임워크 내에서 검사 및 수행한다.
그러나 사용자 정의 어트리뷰트는 결국 프로그래머가 이 과정에 개입해야 한다는 것이다.
 
이번 데모에서는
1. 사용자 정의 어트리뷰트 만들기
2. 사용자 정의 어트리뷰트 검사하기.
에 대해서 알아 보자
 

* 데모 소개

이 데모 코드가 수행하는 일은 다음과 같다.

1. 사용자 정의 어트리뷰트를 생성한다.
2. 실제 클래스에 정의한 사용자 정의 어트리뷰트를 선언한다
3. 현재 실행중인 어셈블리에 사용자 정의 어트리뷰트가 선언된 element 를 검사하고 어트리뷰트를 출력해 본다.
 

* 사용자 정의 어트리뷰트 클래스
간단한 클래스를 만들어 보자.
System.Attribute 를 상속받은 클래스를 만들며 생성자에서 name 를 받고, MyType 이라는 열거형 속성이 있다.

public enum MyType

             {                        

                           Class= 1,

                           Method               

             }

public class CustomAttribute : System.Attribute

             {

                           private string name;

                           public MyType myType;

                           public CustomAttribute(string name)

                           {

                                        this.name = name;

                           }

                           public override string ToString()

                           {

                                        return String.Format("저의이름은 {0}이고 타입은 {1}입니다",this.name,this.myType.ToString());

                           }

             }


 
 
* 어트리 뷰트를 사용하는 클래스(어트리뷰트가 선언된 클래스)
위에 작성한 사용자 정의 어트리뷰트를 실제 클래스에 선언해 보자 

[Custom("TestClass1", myType = MyType.Class)]

public class TestClass1

             {

                           [Custom("TestClass1.TestMethod1", myType = MyType.Method)]

                           public void TestMethod1(){}

                          

                           [Custom("TestClass1.TestMethod2", myType = MyType.Method)]

                           public void TestMethod2(){}            

            

                           public void TestMethod3(){}

             }

 

[Custom("TestClass2", myType = MyType.Class)]

public class TestClass2

             {

                           [Custom("TestClass2.TestMethod1", myType = MyType.Method)]

                           public void TestMethod1(){}

                          

                           [Custom("TestClass2.TestMethod2", myType = MyType.Method)]

                           public void TestMethod2(){}                          

 

                           public void TestMethod3(){}

             }

 

 
* 어트리뷰트를 검사하는 코드 블럭

class DemoClass

{

                 static void Main(string[] args)

                 {                                                                

                              //현재 실행중인 어셈블리의 모든 타입을 검사한다        

                         System.Type[] types =
                                   System.Reflection.Assembly.GetExecutingAssembly().GetExportedTypes();

                              foreach(System.Type type in types)

                              {

                                           //각 타입을 돌면서 사용자 정의 어트리뷰트가 정의되어 있는지를 검사한다

                                           Attribute[] attributesForClass = Attribute.GetCustomAttributes(type);

                                           foreach(Attribute attForClass in attributesForClass)

                                           {

                                                        Console.WriteLine(attForClass);

                                                        // 클래스가 가진 메서드 수만큼 반복한다

                                               foreach(MethodInfo mInfo in type.GetMethods())

                                               {

                                               // 각 메서드를 돌면서 사용자 정의 어트리뷰트가 정의되어 있는지를 검사한다

                                                     foreach (Attribute attForMethod in Attribute.GetCustomAttributes(mInfo))

                                                    {

                                                              //AnimalTypeAttribute 선언 여부 검사

                                                             if (attForMethod.GetType() == typeof(CustomAttribute))

                                                            {

                                                                   Console.WriteLine((CustomAttribute)attForMethod);

                                                             }

                                                      }

                                            }

                                          Console.WriteLine("==============================================");

                                 }           

               }                                                                                          

      }

}

 

 

* 결과 화면

 실행 결과를 보면 클래스 또는 메서드에 CustomAttribute 가 선언되어 있는지 검사하여 ,

 선언되어 있다면 해당 어트리뷰트의 인스턴스 내용을 출력한다.

이름
비밀번호
홈페이지
OX <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요