반응형

오늘 소개해드릴 꿀팁은요.

문자열을 읽어 들여서 문자열 내에 들어있는 특정 단어를 이용하여 개발 중인 코드의 변수로 인식하여 해당 변수에 값을 세팅하는 방법을 소개해 드릴까 합니다.

예를 들면 텍스트 파일로 어떤 설정들을 저장해놓고 해당 설정파일을 읽어 들이면 일일이 변수명과 비교하여 맞으면 설정하는 방식이 아닌 바로 설정 파일 자체에 변수명을 넣어두고 변수명 그대로 값을 설정파일에서 읽어 들이는 것이지요.

이렇게 되면 변수가 아주 많은경우 간단하게 코딩을 할 수 있는 장점이 있겠습니다.

 

다시 말하면 aa,bb,cc 라는 변수가 있고 설정 파일 (텍스트파일) 에 다음과 설정이 있다고 하면요.

aa=#FFFcbc
bb=#12cd43
cc=#FF0000
      :
      :

if (읽어들인 문자열 앞부분 == "aa") aa = 읽어들인 문자열 뒷부분;
if (읽어들인 문자열 앞부분 == "bb") bb = 읽어들인 문자열 뒷부분;
if (읽어들인 문자열 앞부분 == "cc") cc = 읽어들인 문자열 뒷부분;
                 :
                 :

이런식으로 하지 않아도 된다는 것이지요. 만약 몇줄 안된다면 상관 없겠지만 20~30 줄 이상이라면 매번 if 로 정확하게 명칭을 따주는 것도 일입니다. 몇 백줄의 설정이 필요하다면 더더욱 그럴 수 밖에 없겠죠.

 

 

 

 

실제 예제를 볼까요?

컨트롤 해야 하는 컬러 설정 파일을 아래와 같이 준비 합니다. txt, ini 같은 그냥 텍스트 파일로요. 

color_A=#cc3333
color_B=#99cc33
color_C=#cccccc
color_D=#006666
color_E=#00ffff
color_F=#6666cc
color_G=#9966cc

 

위의 문자열들에서 color_A 는 제가 아래 올린 코드의 color_a 에 대한 설정 값으로 사용되게 됩니다. 일일이 if 문을 이용하여 color_A == color_a 인지 color_b 인지 확인하지 않고 해당 클래스가 들고 있는 프라퍼티들의 이름 중에 같은 것이 있는지 찾는 방법이지요.

// 제일 상단에 지시문 추가
using System.Reflection;

// 본 클래스는 메인 클래스가 아니어도 상관 없습니다. 
// 예를 들면 Form 클래스내에 기능적인 용도나 구조체로 사용할 클래스 여도 상관 없음
public class MyColorStyle
{
	private string color_a;
	private string color_b;
	private string color_c;
	private string color_f;
	private string color_e;
	private string color_f;
	private string color_g;
	
	// 외부에서 가져가고 세팅할 수 있도록 get set 함수 하나씩 준비
	public string color_A {get { return color_a;} set { color_a= value; } }
	public string color_B {get { return color_b;} set { color_b= value; } }
	public string color_C {get { return color_c;} set { color_c= value; } }
	public string color_D {get { return color_d;} set { color_d= value; } }
	public string color_E {get { return color_e;} set { color_e= value; } }
	public string color_F {get { return color_f;} set { color_f= value; } }
	public string color_G {get { return color_g;} set { color_g= value; } }
	
	public golfMapcolorStyle()
	{
		//생성자 부분에는 초기화 값 넣어 주시고요.. 
	}
	public void setColor(string clrString) // clrString : "color_A=#FFEECC" 형식의 설정 문자열이 줄단위로 기록되어 있는 파일 전체
	{
		string[] tmps = clrString.Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries); // 줄바꿈 단위로 분리해준다.
		foreach (string str in tmps)
		{
			string[] tmp = str.Split('='); // = 기호를 기준으로 앞의 문자열은 변수 명칭을 검색, 뒤의 문자열은 값으로 사용 

			foreach (PropertyInfo p in typeof(MyColorStyle).GetProperties())
			{
				if (tmp[0] == p.Name)
				{
					tmp[1] = tmp[1].Trim(); // 잘려진 문자열 뒤에 지저분하게 붙는 경우가 있어서 사용함
					p.SetValue(this, tmp[1], null);
				}
			}
		}
	}
}

 

총 7개의 변수가 있지만 단 하나의 방법으로 설정을 할 수 있게 됩니다. 

만약 변수가 100 개 이상이었다면 위와 같은 방식으로 사용하는게 개발 시간을 크게 단축할 수 있을 것입니다. 오류도 많이 줄어들 것이고요.

위 코드에서 제일 핵심이 되는 부분은 바로 아래 부분입니다.

foreach (PropertyInfo p in typeof(MyColorStyle).GetProperties())
{
	// p 에 대하여 무었인가를 할 수 있음
}

클래스가 가지고 있는 변수를 프라퍼티로 보고 프라퍼티의 이름을 확인하여 뭔가를 할 수 있게 되는 것이죠.

p.SetValue 라는 명령어를 이용하여 p 라는 MyColorStyle 라는 클래스의 프라퍼티(변수) 의 값을 설정하는 것이 이번 포스트의 핵심 내용입니다.

 

 

 

만약 변수가 문자열 뿐만 아니라 int 형식도 존재한다고 하면 아래와 같이 간단하게 구현할 수도 있습니다.

foreach (PropertyInfo p in typeof(golfMapcolorStyle).GetProperties())
{
	if (tmp[0] == p.Name)
	{
		try
		{
			tmp[1] = tmp[1].Trim();
			p.SetValue(this, tmp[1], null);
		}
		catch
		{
			tmp[1] = tmp[1].Trim();
			p.SetValue(this, Convert.ToInt32(tmp[1]), null);
		}
	}
}

 

반대로 현재 설정을 저장하는 등의 기능을 구현 할 때에도 위의 코드를 응용하여 특정 클래스가 갖는 모든 프라퍼티를 정확한 변수명과 값으로 손쉽게 저장하는 것이 가능할 것입니다.

 

그럼 이만~

 

뎃글, 공감 은 블로그 작성자에게 큰 힘이 된답니다. 
도움이 되었다 생각되시면  클릭!!  부탁드려요~

 

2020/08/11 - [DEV/c#] - [c#] streamreader 를 이용하여 정확한 라인 위치 찾기

2020/06/29 - [DIY/Arduino] - C# 에서 아두이노로 시리얼 통신 하기

2020/06/03 - [DEV/c#] - C# .net으로 photoshop 연동하기

2020/05/29 - [DEV/c#] - [C#] .net 프로그램에서 MD5 해시 체크파일 만들기

2019/06/21 - [DEV/c#] - [C#] 마우스 매크로를 위한 마우스 자동 클릭 기능 만들기

2020/01/03 - [DEV/c#] - [C#] C# APP 에서 엑셀 연동해보기

반응형

+ Recent posts