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은 깊은 복사가 일어난다)이 더 많아서 훨씬 복잡하지만,
간단히 알고리즘만 이해하기 위한 코드이다.
'C# > C# 학습 (TIL)' 카테고리의 다른 글
C# 중급문법 Day9 디자인패턴 : 커맨드패턴, 퍼사드패턴 (0) | 2022.06.24 |
---|---|
C# 중급문법 Day8 Coroutine (코루틴) (0) | 2022.06.23 |
C# 디자인패턴 : 템플릿메서드 / 옵저버패턴 (0) | 2022.06.21 |
C# 중급문법 Day6 EventHandler (0) | 2022.06.21 |
C# 디자인패턴 : 전략패턴 (0) | 2022.06.20 |