한줄 요약
리플렉션은 런타임(코드 실행 중)에 객체의 타입 정보를 확인하고, 해당 객체의 속성이나 메서드를 동적으로 접근하거나 호출할 수 있게 해주는 C# 기능입니다.
public class InstanceDataBase<T> where T : BaseData
{
static Dictionary<int, Tuple<Type, T>> instanceDictionary;
public static void Initialize()
{
if(instanceDictionary != null) return;
Assembly assembly = Assembly.GetExecutingAssembly();
instanceDictionary = new Dictionary<int, Tuple<Type, T>>();
var instanceDataBases = Resources.LoadAll<T>(GetResourcePath<T>());
foreach (var instance in instanceDataBases)
{
Type currentInstanceType = assembly.GetType(instance.name + GetTypeName<T>());
instanceDictionary.Add(instance.index, new Tuple<Type, T>(currentInstanceType, instance));
//Debug.Log($"{instance.index} : {currentInstanceType.Name}, {instance.name}");
}
Debug.Log(GetTypeName<T>()+" Initialized");
}
...
}
type과 해당 스크립터블 오브젝트 데이터를 instanceDictionary에 저장해, 향후 런타임에서 해당 type에 해당하는 생성자를 찾을 수 있도록 하는 기능을 구현하는데 사용public void GetDatas(SheetData sheet)
{
foreach (var data in sheet.datas)
{
var path = sheet.OutPath + "/" + data[instance.fileNameElement] + ".asset";
Assembly assembly = typeof(BaseData).Assembly;
Debug.Log(data[instance.classNameElement]);
var type = assembly.GetType(data[instance.classNameElement]);
Debug.Log(type.Name);
var dt = (ScriptableObject)AssetDatabase.LoadAssetAtPath(path, type);
if (dt == null)
{
Debug.Log("type : " + type);
dt = DicToClass(type, data, sheet.OutPath);
}
else
{
Debug.Log("type : " + type);
dt = TSVParser.DicToSOData(type, dt, data);
}
EditorUtility.SetDirty(dt);
AssetDatabase.SaveAssets();
}
}
classNameElement에 따라 스크립터블 오브젝트를 생성해 저장하도록하는데 리플랙션을 활용함