Latest web development tutorials

C #을 반사 (반사)

반사 수단은 상기 프로그램을 검출하고 자신의 상태 또는 동작을 변경하는 기능을 액세스 할 수있다.

총회는 결국 구성원이 포함 유형을 포함하는 모듈을 포함하고 있습니다. 반사 개체 패키지 어셈블리, 모듈 및 유형을 제공합니다.

당신은 유형이 기존 개체에 바인딩, 동적 형식의 인스턴스를 만들 반사를 사용하거나 기존 개체에서 유형을 얻을 수 있습니다. 그런 접근 방식의 유형을 전화 또는 필드와 속성에 액세스 할 수 있습니다.

장점과 단점

장점 :

  • 1, 개선 프로세스 유연성과 확장 성을 반영.
  • 2, 커플 링을 감소 적응 능력을 향상시킬 수 있습니다.
  • 생성 전에 하드 코딩 대상 클래스없이 모든 유형의 객체를 제어하는 ​​프로그램을 허용 3.

단점 :

  • 한 성능 문제 : 사용은 본질적으로 동작 설명 반사 때 직접 코드보다 훨씬 느린 액세스에 대한 필드 및 방법. 따라서 기본 응용 프로그램의 유연성과 확장 성을 요구하는 프레임 워크에 반사는 일반적인 절차는 사용하지 않는 것이 좋습니다.
  • 이 프로그램 로직 내의 퍼지 반사의 사용, 프로그래머가 소스 코드 논리를 확인해야하지만 반사 직접 해당 코드보다 더 복잡한 유지 관리 문제를 가져올 소스 코드를 기술하고, 반사 코드를 우회 .

반사 (반사) 사용

다음과 같은 목적을 위해 반사 (반사) :

  • 그것은 당신이 런타임 (속성) 정보에 속성을 볼 수 있습니다.
  • 그것은 각종 모음뿐만 아니라 이러한 종류의 실시 예를 검토 할 수있다.
  • 이 메서드 및 속성 (속성)의 런타임에 바인딩 할 수 있습니다.
  • 그것은 런타임 새로운 타입의 생성을 허용하고, 그 다음 이러한 형태는 일부 작업을 수행하여.

보기 메타 데이터

우리는 이미 위의 섹션에서 (속성) 정보의 속성을 볼 수 있습니다 반사 (반사)의 사용을 언급했다.

목적하는 System.Reflection MemberInfo가 클래스는클래스 (속성)과 관련된 특성을 발견하기 위해 초기화 될 필요가있다. 다음과 같이이 작업을 수행하려면, 대상 객체 클래스를 정의 할 수 있습니다 :

System.Reflection.MemberInfo 정보 = 대한 typeof (MyClass에);

다음 프로그램은이 점을 보여줍니다

시스템을 이용하여;

[AttributeUsage (AttributeTargets.All)]
공용 클래스 HelpAttribute : System.Attribute
{
   공공 읽기 전용 문자열 URL;

   공공 문자열 주제 // 주제 명명 (명명) 매개 변수 {이다
      취득
      {
         항목을 반환;
      }
      세트
      {

         주제 = 값;
      }
   }

   공공 HelpAttribute (문자열 URL이) // URL로 포지셔닝 (위치) 매개 변수 {이다
      this.Url = URL;
   }

   개인 문자열 주제;
}
[HelpAttribute ( "MyClass 클래스에 대한 정보")]
클래스 MyClass에
{
}

네임 스페이스 AttributeAppl
{
   클래스 프로그램
   {
      정적 무효 메인 (문자열 []에 인수)
      {
         System.Reflection.MemberInfo 정보 = 대한 typeof (MyClass에);
         [] 속성의 =의 info.GetCustomAttributes (사실) 개체;
         대한 (INT 나는 = 0; 나는 <attributes.Length; 내가 ++)
         {
            System.Console.WriteLine 속성 ([I]);
         }
         Console.ReadKey ();

      }
   }
}

위의 코드를 컴파일하고 실행되면, 그것은MyClass클래스에 부착 된 사용자 지정 속성을 표시합니다 :

HelpAttribute

이 예에서, 우리는 마지막 장에서 만든DeBugInfo 속성을사용하며,Rectangle클래스의 메타 데이터를 읽을 반사 (반사)를 사용합니다.

시스템을 이용하여;
하는 System.Reflection을 사용함;
네임 스페이스 BugFixApplication
{
   // 버그 수정 사용자 정의 속성은 클래스에 할당 및 회원 [AttributeUsage (AttributeTargets.Class |
   AttributeTargets.Constructor |
   AttributeTargets.Field |
   AttributeTargets.Method |
   AttributeTargets.Property,
   AllowMultiple = TRUE)]

   공용 클래스 DeBugInfo : System.Attribute
   {
      개인 INT bugNo;
      개인 문자열 개발자;
      개인 문자열 lastReview;
      공공 문자열 메시지;

      공공 DeBugInfo (INT의 BG, 문자열 dev에, 문자열 D)
      {
         this.bugNo = BG;
         this.developer = dev에;
         this.lastReview = D;
      }

      공공 INT BugNo
      {
         취득
         {
            bugNo를 반환;
         }
      }
      공공 문자열 개발자
      {
         취득
         {
            개발자를 반환;
         }
      }
      공공 문자열 LastReview
      {
         취득
         {
            lastReview를 반환;
         }
      }
      공공 문자열 메시지
      {
         취득
         {
            메시지를 반환;
         }
         세트
         {
            메시지 = 값;
         }
      }
   }
   [DeBugInfo (45 "자라 알리", "2012년 12월 8일"
	메시지 = "반환 형식이 일치하지")]
   [DeBugInfo (49 "Nuha 알리", "2012년 10월 10일"
	메시지 = "사용하지 않는 변수")]
   클래스 직사각형
   {
      // 멤버 변수는 두 배 길이를 보호;
      이중 폭을 보호;
      공공 직사각형 (더블 리터, 더블 w)
      {
         길이 = 1;
         폭 = w;
      }
      [DeBugInfo (55, "자라 알리", "19/10/2012"
	   메시지 = "반환 형식이 일치하지")]
      공공 이중의 getArea ()
      {
         길이 * 너비를 반환;
      }
      [DeBugInfo (56, "자라 알리", "19/10/2012")]
      공공 무효 표시 ()
      {
         Console.WriteLine ( "길이 : {0}", 길이);
         Console.WriteLine ( "폭 : {0}", 폭);
         Console.WriteLine ( "지역 : {0}"의 getArea ());
      }
   } // 끝 클래스의 직사각형  
   
   클래스 ExecuteRectangle
   {
      정적 무효 메인 (문자열 []에 인수)
      {
         사각형 R = 새로운 Rectangle (4.5, 7.5);
         r.Display ();
         입력 유형 = 대한 typeof (직사각형);
         Rectangle 클래스를 트래버스 //은 (Object가 type.GetCustomAttributes 속성 (false)를) foreach는 속성
         {
            DeBugInfo DBI = (DeBugInfo)의 속성;
            (널 (null)! = DBI)의 경우
            {
               Console.WriteLine ( "버그 번호 : {0}", dbi.BugNo); 없음
               Console.WriteLine ( "개발자 : {0}", dbi.Developer);
               Console.WriteLine ( "마지막 검토 : {0}",
					dbi.LastReview);
               Console.WriteLine ( "비고 : {0}", dbi.Message);
            }
         }
         
         // 반복 처리 방법은 () (type.GetMethods에 MethodInfo 분) foreach는 속성
         {
            foreach는 (m.GetCustomAttributes의 속성 (참))
            {
               DeBugInfo DBI = (DeBugInfo)는;
               (널 (null)! = DBI)의 경우
               {
                  Console.WriteLine ( "버그 번호 : {0} 방법에 대한 {1}",하지
						dbi.BugNo, m.Name);
                  Console.WriteLine ( "개발자 : {0}", dbi.Developer);
                  Console.WriteLine ( "마지막 검토 : {0}",
						dbi.LastReview);
                  Console.WriteLine ( "비고 : {0}", dbi.Message);
               }
            }
         }
         Console.ReadLine ();
      }
   }
}

상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를

길이 : 4.5
폭 : 7.5
지역 : 37,125
버그 번호 : 49
개발자 : Nuha 알리
마지막 검토 : 2012년 10월 10일
비고 : 사용하지 않는 변수
버그 번호 : 45
개발자 : 자라 알리
마지막 검토 : 2012년 12월 8일
비고 : 반환 형식이 일치
버그 번호 : 55, 방법에 대한 :의 getArea
개발자 : 자라 알리
마지막 검토 : 19/10/2012
비고 : 반환 형식이 일치
버그 번호 : (56), 방법 : 디스플레이
개발자 : 자라 알리
마지막 검토 : 19/10/2012
비고 :