C#반사 유틸리티 노트

7427 단어 C#
반사는 패키지된 프로그램 세트, 모듈 및 유형의 객체(Type 유형)를 제공합니다.반사동태를 사용하여 유형의 실례를 만들고 유형을 기존 대상에 귀속시키거나 기존 대상에서 유형을 가져와 그 방법을 호출하거나 필드와 속성에 접근할 수 있습니다.코드에 속성을 사용하면 반사로 접근할 수 있습니다.
프로그램 집합는 모듈을 포함하고 모듈은 유형을 포함하며 유형은 구성원을 포함한다.반사는 봉인 프로그램 집합, 모듈, 유형의 대상을 제공한다.반사를 사용하여 유형의 실례를 동적으로 만들고 유형을 기존 대상에 귀속시키거나 기존 대상에서 유형을 가져올 수 있습니다.그런 다음 유형 방법을 호출하거나 필드와 속성에 액세스할 수 있습니다.일반적으로 반사에는 다음과 같은 용도가 있습니다.
  • 사용 Assembly 정의 및 로드 프로그램 집합, 프로그램 집합 목록에 열거된 모듈을 로드하고, 이 프로그램에서 집중적으로 유형을 찾아 이 유형의 실례를 만듭니다.
  • 사용Module으로 다음과 같은 유사한 정보를 알 수 있다. 모듈의 프로그램 집합과 모듈의 클래스 등을 포함한다.모듈에 정의된 모든 전역 방법이나 다른 특정한 비전역 방법도 얻을 수 있습니다.
  • 사용ConstructorInfo으로 다음과 같은 정보를 알 수 있다. 구조 함수의 이름, 매개 변수, 액세스 수식자(예를 들어public이나private)와 실현 상세한 정보(예를 들어 abstract나virtual) 등이다.TypeGetConstructors 또는 GetConstructor 방법을 사용하여 특정한 구조 함수를 호출한다.
  • 사용MethodInfo으로 다음과 같은 정보를 알 수 있습니다. 방법의 이름, 되돌아오는 유형, 파라미터, 액세스 수식자(예를 들어public이나private)와 실현 상세한 정보(예를 들어 abstract나virtual) 등입니다.TypeGetMethods 또는 GetMethod 방법을 사용하여 특정한 방법을 호출한다.
  • 사용FieldInfo으로 다음과 같은 정보를 이해한다. 필드의 이름, 액세스 수식자(예를 들어public나private)와 실현에 대한 상세한 정보(예를 들어static) 등.필드 값을 가져오거나 설정합니다.
  • EventInfo를 사용하여 다음과 같은 유사한 정보를 파악한다. 이벤트의 이름, 이벤트 처리 프로그램의 데이터 유형, 사용자 정의 속성, 성명 유형과 반사 유형 등이다.이벤트 처리 프로그램을 추가하거나 제거합니다.
  • PropertyInfo를 사용하여 다음과 같은 유사한 정보를 알 수 있다. 속성의 이름, 데이터 유형, 성명 유형, 반사 유형과 읽기 전용 또는 쓰기 가능 상태 등이다.등록 정보 값을 가져오거나 설정합니다.
  • ParameterInfo를 사용하여 다음과 같은 유사한 정보를 알 수 있다. 파라미터의 이름, 데이터 유형, 파라미터가 입력 파라미터인지 출력 파라미터인지, 그리고 파라미터가 방법 서명에 있는 위치 등이다.
  • 한 응용 프로그램 영역의 반사 상하문에서만 작업할 때 CustomAttributeData를 사용하여 사용자 정의 속성에 대한 정보를 알아보십시오.CustomAttributeData를 사용하면 속성의 실례를 만들지 않아도 그것들을 검사할 수 있습니다.

  • System.Reflection.Emit 명명 공간의 클래스는 특수한 형식의 반사를 제공하여 실행할 때 유형을 구성할 수 있습니다.
    또한 사용자가 유형을 선택하고 선택한 유형에 대한 정보를 볼 수 있도록 유형 브라우저라는 응용 프로그램을 만드는 데 반사를 사용할 수도 있습니다.
    반사에는 또 다른 용도가 있다.JScript와 같은 언어 컴파일러는 반사를 사용하여 기호 테이블을 구성합니다.System.Runtime.Serialization 명명 공간의 클래스는 반사로 데이터에 접근하고 오래 저장할 필드를 확인합니다.System.Runtime.Remoting 명명 공간의 클래스는 서열화를 통해 간접적으로 반사를 사용한다.
      —— MSDN 반사(C# )    반사 개요
     

      1. 동적 로드 프로그램 세트


    우리는 프로그램 집합의 파일 이름을 통해 프로그램 집합을 불러올 수 있다.
    Assembly libAssembly = Assembly.Load("Lib.Entity");

    프로그램 집합을 얻은 후에, 우리는 이 프로그램 집합의 유형을 하나 또는 모두 얻을 수 있다.
     

      2. 프로그램 집합의 형식 가져오기


    클래스의 전체 이름(네임스페이스 포함)을 알면 다음과 같은 방법으로 클래스의 유형을 얻을 수 있습니다.
    Type bookType = libAssembly.GetType("Lib.Entity.Book");

    또는 이 프로그램 집합의 모든 유형을 얻을 수 있습니다.
    Type[] allTypes = libAssembly.GetTypes();

     

      3. 동적 생성 유형의 인스턴스


    유형을 얻은 후에는 유형에 따라 유형의 인스턴스를 생성할 수 있습니다.
    Lib.Entity.Book book = Activator.CreateInstance(bookType) as Lib.Entity.Book;

    사실 우리가 하나의 유형을 알게 된 후에 동태적으로 하나의 실례를 만드는 것은 매우 불합리하다. 개인적으로 여기는 하나의 인터페이스나 하위 클래스를 실례화할 수 있고 IOC(반전 제어)에 비교적 유용하다고 생각한다.예를 들면 다음과 같습니다.
    IBook bk = Activator.CreateInstance(bookType) as Lib.Entity.Book;

     

      4. 유형 호출 방법


    유형을 인스턴스화한 후 다음과 같은 방법으로 유형을 호출할 수 있습니다.
    MethodInfo method = bookType.GetMethod("GetBookString", BindingFlags.Instance | BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.NonPublic);
    output(method.Invoke(book, null).ToString());

     
    GetMethod 방법을 통해 뒤에 있는 귀속 표지와 결합하면 공공 방법뿐만 아니라 개인과 보호받는 방법, 정적 방법도 얻을 수 있고 그것들을 호출할 수 있다.
     

      5. 액세스 필드 및 속성


    다음과 같은 유형의 GetProperty 방법을 사용하여 속성 정보를 얻을 수 있습니다.
    PropertyInfo info = bookType.GetProperty("Title");

    이 속성에 값을 지정할 수도 있습니다.
    info.SetValue(book, value, null);

     
    필드의 접근이 비슷합니다.
    이러한 액세스 필드 및 속성 기술은 ORM에서 자주 사용됩니다.
     

      6. Attribute 액세스


    이 Attribute는 유형, 메서드 또는 필드에 대한 손질입니다.만약 존재한다면, 우리는 실행할 때 얻을 수 있습니다.
    bookType.GetCustomAttributes(false);

    이 기술은 이전과 서로 결합하여 ORM 프레임워크를 실현하는 데 자주 사용된다.

    좋은 웹페이지 즐겨찾기