본문 바로가기
C#/C# 학습 (TIL)

C# 중급문법 Day7 Reflection / DeepCopy 일반화(reflection 적용)

by jjiing 2022. 6. 22.

Reflection

타입에 대한 정보를 담는 메타적인 문법

 

 

 

 

<추가 설명>

 

using System.Reflection;
using System;

reflection 적용을 위해서 필요하다.

 

 

타입에 클래스 정보를 담기

Type type = tempA.GetType();

type에 담기는 것은 tempA의 클래스 정보(데이터타입)이지 tempA가 아니다.

 

 

 

클래스 내의 정보(변수)를 싹 다 불러오기

 MethodInfo[] methods = type.GetMethods();   //type (클래스) 내부의 정보 (멤버 변수, 멤버함수)를 다 불러옴
        int count = 0;
        foreach (var method in methods)
        {
            Debug.Log("번째 메서드의 이름 " +method.Name);
            count++;
            //Temp class의 속성, 기능 등을 불러옴
        }

 

 

 

 

타입의 멤버변수 불러오고 수정해주기

Debug.Log(type.GetField("tempValue").GetValue(tempA));
type.GetField("tempValue").SetValue(tempA, 30);
Debug.Log(type.GetField("tempValue").GetValue(tempA));

- 마지막 (tempA) :type에는 데이터타입 정보만 있기 때문에 어떤 객체(tempA)의 정보를 가져올 건지 명시해줘야함

 

type.GetFields 멤버 변수 가져옴

type.GetPropertys 멤버 프로퍼티 가져옴

 

 

 

타입의 멤버함수 불러오기

       //매개변수와 리턴타입 없는 함수의 경우
       type.GetMethod("Func").Invoke(tempA, null);

        //매개변수와 리턴타입 있는 함수의 경우
        object[] args = new object[1]; //우리가 넣고싶은 매개변수는 int 하나이므로 1개
        args[0] = 2; //매개변수 값을 여기에 넣어줌
        
        var result= type.GetMethod("FuncParameter").Invoke(tempA, args);
        //매개변수 args를 배열로 넣어줘야함
        //리턴타입이 있으므로 var 변수에 리턴값을 담아줌
        Debug.Log(result);

 

 

 

 

 

 

리플렉션을 적용한 deepCopy 일반화

 

딥카피?

c#에서 구조체는 깊은복사가 일어나지만 클래스는 얕은 복사가 일어남.
클래스도 깊은복사를 해야하는 경우가 있는데, 이를 위해 딥카피 메서드를 만들어 적용시켜준다.

원래는 예외사항(ex. 구조체 중 string은 깊은 복사가 일어난다)이 더 많아서 훨씬 복잡하지만,

간단히 알고리즘만 이해하기 위한 코드이다.