본문 바로가기
CODING/C#

C# Indexer를 이용해 class 내 다수의 배열 객체에 접근하는 방법

by marketingsj 2022. 11. 17.

XingAPI를 이용한다면, DevCenter 프로그램에서 C++용 헤더파일을 클립보드 형태로 구할 수 있다.

이 코드구문을 이용하여 Transition의 InBlock, OutBlock에 내용을 담아내거나 획득하도록 설계할 수 있다.

필자는 이 방식을 차용하여 OutBlock을 클래스로 생성하여 TR 요청을 통해 데이터를 획득할 때 각 TR Class의 인스턴스로 적재할 수 있도록 설계하고자 한다.

 

여기서 고심되었던 코드구문은 class 내의 여러 Array 객체가 존재할 때 외부 메인함수에서 class의 인스턴스에 Indexer형태로 접근하여 데이터를 적재하거나 획득하는 과정을 구현하는 것이었다.

indexing 방식은 아래와 같이 Reflection을 활용한 코드로 구현하였다.

using System.Reflection;
using System.Runtime.InteropServices;

class ConsoleTester_OutBlock
{
    static void Main(string[] args)
    {
        _t8430OutBlock block = new();
        block[0] = 'a';
        block[3] = 'b';
        block[20] = 'c';
        block[40] = 'd';
        for (int idx = 0; idx < block.Length; idx++)
        {
            Console.WriteLine(block[idx]);
        }
    }
}
class OutBlock
{
    internal Dictionary<FieldInfo, int> fieldInfoDict = new Dictionary<FieldInfo, int>();

    public OutBlock()
    {
        foreach (FieldInfo fieldInfo in this.GetType().GetFields())
        {
            int arrLen = (fieldInfo.GetValue(null) as Array).Length;
            fieldInfoDict.Add(fieldInfo, arrLen);
        }
    }
    public int Length
    {
        get
        {
            int sum = 0;
            foreach (var dict in fieldInfoDict)
            {
                sum += dict.Value;
            }
            return sum;
        }
    }
    public char this[int idx]
    {
        get
        {
            int sum = 0;
            char res = char.MinValue;
            foreach (var dict in fieldInfoDict)
            {
                sum += dict.Value;
                if (sum > idx)
                {
                    int num = idx - (sum - dict.Value);
                    res = (dict.Key.GetValue(null) as char[])[num];
                    return res;
                }
            }
            return res;
        }
        set
        {
            int sum = 0;
            foreach (var dict in fieldInfoDict)
            {
                sum += dict.Value;
                if (sum > idx)
                {
                    int num = idx - (sum - dict.Value);
                    char[] preVal = (dict.Key.GetValue(null) as char[]);
                    preVal[num] = value;
                    dict.Key.SetValue(null, preVal);
                    return;
                }
            }
        }
    }
}

class _t8430OutBlock : OutBlock
{
    public static char[] hname = new char[20];
    public static char[] shcode = new char[6];
    public static char[] expcode = new char[12];
    public static char[] etfgubun = new char[1];
    public static char[] uplmtprice = new char[8];
    public static char[] dnlmtprice = new char[8];
    public static char[] jnilclose = new char[8];
    public static char[] memedan = new char[5];
    public static char[] recprice = new char[8];
    public static char[] gubun = new char[1];
}

Reflection을 통해 해당 OutBlock 정보를 담아내기 위한 클래스(이하 TR class)의 모든 Field에 접근하여 순차적으로 배열의 리스트를 뽑고, 각각의 배열의 크기와 FieldInfo를 Dictionary의 형태로 담아낸다

Indexer의 접근이 시작되면, Dictionary에 담긴 배열의 크기 리스트를 요청한 Index로부터 순서를 구하여 배열의 위치를 특정하고 해당 정보를 담아내거나 획득하는 과정을 구현했다.

댓글