C#에서 리플렉션을 사용하여 속성 값 가져오기

Aimen Fatima 2023년10월12일
  1. C#System.Reflection
  2. C#에서 리플렉션을 사용하여 속성 값 가져오기
C#에서 리플렉션을 사용하여 속성 값 가져오기

이 문서에서는 C#에서 System.Reflection 네임스페이스를 사용하는 방법을 자세히 설명합니다. Reflection 네임스페이스를 사용하여 샘플 프로젝트를 살펴보고 속성 값을 가져옵니다.

C#System.Reflection

C#의 System.Reflection 네임스페이스는 코드의 매개 변수, 어셈블리, 메서드, 모듈 및 기타 요소에 대한 정보를 가져오는 데 사용됩니다. 이 네임스페이스를 프로그램으로 가져오면 모든 클래스 유형, 매개변수 값, 메서드 등을 가져올 수 있습니다.

System.Reflection 기능을 사용하여 개체의 속성 값을 가져오는 기술을 시연합니다.

C#에서 리플렉션을 사용하여 속성 값 가져오기

Visual Studio에서 C# 프로젝트를 만듭니다. 먼저 Reflection 네임스페이스를 프로그램으로 가져옵니다.

using System.Reflection;

System 네임스페이스에는 개체 유형을 반환하는 Type 클래스가 포함되어 있습니다.

Type type = _obj.GetType();

Reflection 네임스페이스에는 유형의 속성을 가져오는 PropertyInfo라는 클래스가 포함되어 있습니다. Type 클래스에는 각각 속성과 클래스 속성의 배열을 반환하는 메서드 GetProperty()GetProperties()가 있습니다.

PropertyInfo[] properties = type.GetProperties();

PropertyInfo 클래스에는 속성의 이름과 여기에 할당된 값을 각각 반환하는 NameGetValue()라는 멤버 특성 및 메서드가 포함되어 있습니다.

Console.WriteLine(p.Name + " : " + p.GetValue(_obj));

다음은 예제 프로젝트의 전체 코드 스니펫입니다.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Reflection;

namespace GettingPropertyValue {
  public class Book {
    private String bookTitle;
    private int numberOfPages;

    public Book(String title, int pages) {
      bookTitle = title;
      numberOfPages = pages;
    }

    public String Title {
      get { return bookTitle; }
    }

    public int Pages {
      get { return numberOfPages; }
      set { numberOfPages = value; }
    }
  }

  public class MyGetValue {
    public static void Main() {
      Console.WriteLine("Getting all properties...");
      Book book = new Book("Get Property Value in C#", 198);
      GetPropertyValues(book);

      Console.WriteLine("\n\nGetting value of a single property...");
      GetPropertyValue(book, "Pages");
      Console.ReadKey();
    }

    private static void GetPropertyValues(Object _obj) {
      // returns the type of _obj
      Type type = _obj.GetType();
      Console.WriteLine("Type of Object is: " + type.Name);

      // create an array of properties
      PropertyInfo[] properties = type.GetProperties();
      Console.WriteLine("Properties (Count = " + properties.Length + "):");

      // print each property name and value
      foreach (var p in properties)
        if (p.GetIndexParameters().Length == 0)
          Console.WriteLine(p.Name + "(" + p.PropertyType.Name + ") : " + p.GetValue(_obj));
        else
          Console.WriteLine("   {0} ({1}): <Indexed>", p.Name, p.PropertyType.Name);
    }

    // method to get a single property value from a string
    private static void GetPropertyValue(Object _obj, string property) {
      // prints property name
      Console.WriteLine("Property : " + _obj.GetType().GetProperty(property).Name);

      // prints property value
      Console.WriteLine("Value : " + _obj.GetType().GetProperty(property).GetValue(_obj));
    }
  }

}

우리는 두 가지 속성(제목과 페이지 수)을 가진 Book이라는 클래스를 만들었습니다. 다른 클래스인 MyGetValue에 두 개의 메서드(예: GetPropertyValueGetPropertyValues)를 만들었습니다.

GetProjectValue(Object _obj, string property)는 개체와 문자열 또는 속성을 매개 변수로 사용하고 속성 이름과 값을 출력으로 인쇄합니다.

반면 GetPropertyValues(Object _obj) 메서드는 개체를 매개 변수로 사용합니다. 먼저 객체의 유형을 결정하고 해당 객체의 값과 함께 모든 속성을 가져옵니다.

코드 조각의 출력은 다음과 같습니다.

Getting all properties...
Type of Object is: Book
Properties (Count = 2):
Title(String) : Get Property Value in C#
Pages(Int32) : 198

Getting value of a single property...
Property : Pages
Value : 198

괴짜라면 System.Reflection C#을 방문하여 C#의 Reflections에 대한 자세한 내용을 참조할 수 있습니다.