λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ–₯️/C#

[C#] λ¦¬ν”Œλ ‰μ…˜(Reflection): 동적 λ©”μ„œλ“œ μƒμ„±ν•˜κΈ°

by HanaV 2023. 10. 11.
728x90
 
 

Reflection

 

λ¦¬ν”Œλ ‰μ…˜μ„ ν™œμš©ν•˜λ©΄ λ™μ μœΌλ‘œ λ©”μ„œλ“œλ„ μƒμ„±ν•˜κ³ , λ™μ μœΌλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•΄μ„œ λ©”μ„œλ“œλ₯Ό μ‹€ν–‰μ‹œν‚¬ 수 μžˆλ‹€.

1. Assembly  λ§Œλ“€κΈ°

AssemblyBuilder assembly = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("CalculatorAssembly"), AssemblyBuilderAccess.Run);

2. Assembly μ•ˆμ— Module λ§Œλ“€κΈ°

ModuleBuilder module = assembly.DefineDynamicModule("CalculatorModule");

3. Module μ•ˆμ— Class λ§Œλ“€κΈ°

TypeBuilder type = module.DefineType("CalculatorClass");

4. Class μ•ˆμ— Method λ§Œλ“€κΈ°

MethodBuilder method = type.DefineMethod(
    "Add",
    MethodAttributes.Public,
    typeof(int), // return type
    new Type[] { typeof(int), typeof(int) }); // parameter types

5. ILGeneratorλ₯Ό μ‚¬μš©ν•΄μ„œ Method μ™„μ„±μ‹œν‚€κΈ°

ILGenerator generator = method.GetILGenerator();
generator.Emit(OpCodes.Ldarg_1); // args[0]
generator.Emit(OpCodes.Ldarg_2); // args[1]

generator.Emit(OpCodes.Add); // added

generator.Emit(OpCodes.Ret); // return

 

μœ„ μ½”λ“œλŠ” 두 인자λ₯Ό λ°›μ•„ Add ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€. 즉, μ•„λž˜ λ©”μ„œλ“œλ₯Ό λ§Œλ“œλŠ” μ½”λ“œμ΄λ‹€.

public int Add(int a, int b)
{
    return a + b;
}

 

6. Type μ™„μ„±μ‹œν‚€κΈ°

Type dynamicType = type.CreateType();

7. 동적 μΈμŠ€ν„΄μŠ€ 생성 ν›„ λ©”μ„œλ“œ μ‹€ν–‰μ‹œν‚€κΈ°

object instance = Activator.CreateInstance(dynamicType);
MethodInfo calculate = dynamicType.GetMethod("Add");
Console.WriteLine(calculate.Invoke(instance, new object[] { 5, 7 }));

 

동적 λ©”μ„œλ“œλ₯Ό μƒμ„±ν•˜λ©΄ μœ μ—°μ„±κ³Ό ν™•μž₯성은 물둠이고, μ½”λ“œλ₯Ό λ‹€μ‹œ μ»΄νŒŒμΌν•˜κ±°λ‚˜ λ‹€μ‹œ λΉŒλ“œν•  ν•„μš” 없이 μƒˆλ‘œμš΄ κΈ°λŠ₯을 λ„μž…ν•˜κ±°λ‚˜ μ½”λ“œλ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€λŠ” 큰 μž₯점이 μžˆλ‹€.

728x90

"); wcs_do();