๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[C# ์Šคํ„ฐ๋””] ๋ฆฌํ”Œ๋ ‰์…˜(Refelction) - MDI ์ž์‹ ํผ ๋„์šฐ๊ธฐ

by lee365 2021. 1. 12.
๋ฐ˜์‘ํ˜•

๐Ÿ“š ๋ฆฌํ”Œ๋ ‰์…˜(Reflection)

 - ๊ฐ์ฒด๋ฅผ X-Ray ์‚ฌ์ง„์ฒ˜๋Ÿผ ๊ฐ์ฒด์˜ ํ˜•์‹(Type)์ •๋ณด๋ฅผ ๋“ค์—ฌ๋‹ค๋ณด๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

 - ๊ฐ์ฒด์˜ ํ˜•์‹์ด๋ฆ„, ํ”„๋กœํผํ‹ฐ ๋ชฉ๋ก, ๋ฉ”์†Œ๋“œ ๋ชฉ๋ก, ํ•„๋“œ, ์ด๋ฒคํŠธ ๋ชฉ๋ก๊นŒ์ง€ ๋Ÿฐํƒ€์ž„์— ํ˜•์‹์ •๋ณด๋ฅผ ๋ชจ๋‘ ์—ด์–ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 - ์ด๋Ÿฌํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠน์ • ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 - Activator.CreateInstance(Type type) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž…๋ ฅ๋ฐ›์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

CreateInstance(Type type)
ํ•ด๋‹น ํ˜•์‹์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์—†๋Š” ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์ •๋œ ํ˜•์‹์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. -MSDN ์ฐธ๊ณ -

 

๐Ÿ“– ์ž์‹ ํผ ๋„์šฐ๊ธฐ

 AssemblyName๊ณผ TypeName์„ ๊ฐ€์ง€๊ณ  ์ž์‹ ํผ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ™”๋ฉด์— ๋„์›Œ์ค€๋‹ค.

 

 1. Assembly๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

Assembly assembly = Assembly.Load(assemblyName);
Load(AssemblyName assemblyName)
ํ•ด๋‹น AssemblyName์ด ์ง€์ •๋œ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.

// AssemblyName์€ ํ•ด๋‹น ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋ฐ”์ธ๋”ฉํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

 2. ํ•ด๋‹น Assembly๊ฐ์ฒด์˜ ํƒ€์ž…์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

 

Type type = assembly.GetType(typeName);
GetType(String string)
์–ด์…ˆ๋ธ”๋ฆฌ ์ธ์Šคํ„ด์Šค์—์„œ ์ง€์ •๋œ ์ด๋ฆ„์„ ๊ฐ€์ง„ Type ๊ฐœ์ฒด๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

 

 3. Activator.CreateInstance(type)์„ ์‚ฌ์šฉํ•ด ์ž…๋ ฅ๋ฐ›์€ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ™”๋ฉด์— ๋„์›Œ์ค€๋‹ค.

 

BaseMdiChildForm childForm = (BaseMdiChildForm)Activator.CreateInstance(type); 

childForm.MdiParent = this;
childForm.Show();
Activator.CreateInstance(Type type)
object๋กœ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜•๋ณ€ํ™˜ ํ•ด์ค€๋‹ค.

 

 

๐Ÿ„ ์˜ˆ์ œ

    // ์ž์‹ํผ ์—ด๊ธฐ
    OpenForm("MdiProject", "MdiProject.Frm0001");

    // OpenForm()
    private void OpenForm(string assemblyName, string typeName)
    {
        Assembly assembly = Assembly.Load(assemblyName);
        Type type = assembly.GetType(typeName);
        var childForm = (BaseMdiChildForm)Activator.CreateInstance(type);

        childForm.MdiParent = this;
        childForm.BringToFront();
        childForm.Show();
    }

 

๋ฐ˜์‘ํ˜•