Reflection
리νλ μ
리νλ μ (Reflection)μ 'λ°μ¬'λΌλ λ»μ΄λ€. λ°μ¬λλ©΄ μμ μ λͺ¨μ΅μ΄ 보μ΄λ κ²μ²λΌ, C#μμ 리νλ μ μ μκΈ° μμ μ λν μ 보λ₯Ό λ°μ¬νλ―μ΄ λ³΄λ κΈ°λ₯μ λ§νλ€.
λ€μ μ νν μ 리νμλ©΄, 리νλ μ μ΄λ λ°νμ μ€μ νλ‘κ·Έλ¨μ λ©νλ°μ΄ν°λ₯Ό μ»κ³ μμ ν μ μλ κΈ°λ₯μ΄λ€. κ°μ²΄μ νμ μ΄λ¦, νλ‘νΌν°, λ©μλ, νλ, μ΄λ²€νΈ λ± κ·Έ κ°μ²΄μ μ 보λ₯Ό λ€μ¬λ€λ³Ό μ μλ€.
λ©νλ°μ΄ν°λ λ°μ΄ν°μ κ΄ν λ°μ΄ν°μ΄λ€. μ¦, λ°μ΄ν°μ λν μ€λͺ , ꡬ쑰, μμ± λλ λ€λ₯Έ λ°μ΄ν°μ μ 보λ₯Ό λ΄κ³ μλ λ°μ΄ν°λ₯Ό λ§νλ€.
리νλ μ μ΄ νμν μ΄μ
κ·Έλ λ€λ©΄ 리νλ μ μ μ νμν κ²μΌκΉ?
리νλ μ
μ μ£Όλ‘ λ¨μ ν
μ€νΈλ₯Ό ν λ λ§μ΄ μ°μΈλ€. μ½λμ κ° λΆλΆμ΄ μ¬λ°λ₯΄κ² μλνλμ§ νμΈν λ, μ°λ¦¬λ κ·Έ λ©μλμ ν
μ€νΈ μΌμ΄μ€λ₯Ό λ£μ΄κ°λ©° νμΈμ νλ€. λ©μλ μκ° μ λ€λ©΄ 무리 μκ² μ§λ§, λ§μ½ μ λ°±κ°λ₯Ό λμ΄κ°λ€λ©΄ νλνλ μλμΌλ‘ νλ κ²μ λ§€μ° λΉν¨μ¨μ μΌ κ²μ΄λ€.
리νλ μ
μ μ¬μ©νλ©΄, 리νλ μ
μΌλ‘ ν
μ€νΈ ν ν΄λμ€μ λ©μλλ₯Ό λμ μΌλ‘ κ²μ¬ν ν, ν
μ€νΈ λ©μλλ₯Ό λμ μΌλ‘ μμ±νκ² νκ³ μ€ννλ©΄ ν¨μ¨μ μΌλ‘ λ¨μ ν
μ€νΈλ₯Ό μ§νν μ μλ€.
λν, μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ°λλ°, κ·Έ λΌμ΄λΈλ¬λ¦¬κ° μ΄λ»κ² ꡬμ±λμ΄ μλμ§ λΆμμ΄ νμν λ 리νλ μ μΌλ‘ μΈλΆ λΌμ΄λΈλ¬λ¦¬λ₯Ό κ²μ¬ν μλ μλ€.
λ λ€λ₯Έ κ°λ ₯ν κΈ°λ₯μ 리νλ μ
μ μ¬μ©ν΄μ λμ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±ν΄μ μμ
μ μνν μ μλ€λ κ²μ΄λ€.
λμ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νλ€λ κ²μ λ°νμμμ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ΄κ³ , μ μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νλ€λ κ²μ μ»΄νμΌ μμ μμ μ΄λ―Έ κ°μ²΄λ₯Ό μμ±νκ³ ν λΉνλ κ²μ΄λ€. λμ μΌλ‘ μΈμ€ν΄μ€λ₯Ό μμ±νλ κ²μ νλ‘κ·Έλ¨μ΄ λ°νμ μν©μ λ°λΌ κ°μ²΄λ₯Ό μ‘°μνκ±°λ νμ₯νλ λ° μ μ°νκ² νμ©λ μ μλ€.
object ν΄λμ€μ GetType()
λͺ¨λ λ°μ΄ν° νμμ Object νμμ ν¬ν¨λκΈ° λλ¬Έμ GetType() λ©μλλ₯Ό μ¬μ©ν μ μλ€. GetType() λ©μλλ κ°μ²΄μ νμ μ 보λ₯Ό λ°ννλ λ° μ¬μ©λλ©°, κ°μ²΄μ νμ μ 보λ₯Ό 리νλ μ μ ν΅ν΄ μ κ·Όν μ μκ² ν΄ μ€λ€.
string a = "Hello, World!";
Type type = a.GetType();
Console.WriteLine(type.FullName);
Nameμ String, FullNameμ System.String λ± κ°μ Έμ¨ κ°μ²΄μ νμμ λ€μν λ©μλλ₯Ό μ¬μ©ν΄μ μ 보λ₯Ό λ³Ό μ μλ€.
typeof()λ 리νλ μ μΌκΉ?
typeof() μ°μ°μλ μ»΄νμΌ μμ μμ νμμ κ²μ¬νκΈ° λλ¬Έμ 리νλ μ μ μλλ€. typeof μ°μ°μμ GetType() λ©μλμ μ°¨μ΄λ μλμ²λΌ typeofλ νμμ μ§μ λ°κ³ , GetType()μ μΈμ€ν΄μ€μ λν΄ νΈμΆλλ€λ κ²μ΄λ€.
Type intType = typeof(int);
Type stringType = text.GetType();
λ§μ½ μΈμ€ν΄μ€λ₯Ό μμ±νμ§ μκ³ GetType()μΌλ‘ string νμμ λ°λ‘ λ°μμ€κ³ μΆμΌλ©΄, μλμ κ°μ΄ νμμ μ΄λ¦μ λ£μ΄μ£Όλ©΄ λλ€.
Type stringType = Type.GetType("System.String");
λ€μ λμκ°μ typeμ μλ λ©μλλ€μ λ€μ μ΄ν΄λ³΄λ©΄, μ λ§ λ§μ λ©νλ°μ΄ν°λ₯Ό λ½μλΌ μ μλ κ²μ μ μ μλ€. μ΄ λͺ¨λ κ²μ μ¬μ©λ²μ μΈμΈ μλ μμ§λ§, μ¬μ©λ²μ κ±°μ λ€ λΉμ·νκΈ° λλ¬Έμ λͺ κ°λ§ μμλ‘ λ³΄λλ‘ νμ.
μλλ κ°κ° μΈν°νμ΄μ€, νλ, λ©μλ, νλ‘νΌν°λ₯Ό λ½μλ΄λ λ©μλμ΄λ€.
GetInterfaces() (return: Type[])
static void PrintInterfaces(Type type)
{
Type[] interfaces = type.GetInterfaces();
foreach (Type i in interfaces) {
Console.WriteLine($"Name: {i.Name}");
}
}
GetFields() (return: FieldInfo[])
static void PrintFields(Type type)
{
FieldInfo[] fields = type.GetFields(
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance); // μ΄ λΆλΆμ μ‘°μ νμ¬ κ²μ μ΅μ
μ μ§μ ν μλ μλ€
foreach (FieldInfo f in fields) {
string accessLevel = "protected";
if (f.IsPublic) {
accessLevel = "Public";
}
else if (f.IsPrivate) {
accessLevel = "Private";
}
Console.WriteLine($"Access: {accessLevel}, Type: {f.FieldType.Name}, Name: {f.Name}");
}
}
GetMethods() (return: MethodInfo[])
static void PrintMethods(Type type)
{
MethodInfo[] methods = type.GetMethods();
foreach (MethodInfo m in methods) {
Console.Write($"ReturnType: {m.ReturnType.Name}, Name: {m.Name}, Parameter: ");
ParameterInfo[] parameters = m.GetParameters();
for (int i = 0; i < parameters.Length; i++) {
Console.Write(parameters[i].ParameterType.Name);
if (i < parameters.Length - 1) {
Console.Write(", ");
}
}
Console.WriteLine();
}
}
GetProperties() (return: PropertyInfo[])
static void PrintProperties(Type type)
{
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo p in properties) {
Console.WriteLine($"Type: {p.PropertyType.Name}, Name: {p.Name}");
}
}
λ¨Όμ intμ λν νμ μ 보λ₯Ό λ½μλ΄λ³΄μ.
int a = 0;
Type type = a.GetType();
PrintInterfaces(type);
PrintFields(type);
PrintMethods(type);
PrintProperties(type);
Int32
----- Interfaces -----
Name: IComparable
Name: IConvertible
Name: ISpanFormattable
Name: IFormattable
Name: IComparable`1
Name: IEquatable`1
Name: IBinaryInteger`1
Name: IBinaryNumber`1
Name: IBitwiseOperators`3
Name: INumber`1
Name: IAdditionOperators`3
Name: IAdditiveIdentity`2
Name: IComparisonOperators`2
Name: IEqualityOperators`2
Name: IDecrementOperators`1
Name: IDivisionOperators`3
Name: IIncrementOperators`1
Name: IModulusOperators`3
Name: IMultiplicativeIdentity`2
Name: IMultiplyOperators`3
Name: ISpanParseable`1
Name: IParseable`1
Name: ISubtractionOperators`3
Name: IUnaryNegationOperators`2
Name: IUnaryPlusOperators`2
Name: IShiftOperators`2
Name: IMinMaxValue`1
Name: ISignedNumber`1
----- Fields -----
Access: Private, Type: Int32, Name: m_value
Access: Public, Type: Int32, Name: MaxValue
Access: Public, Type: Int32, Name: MinValue
----- Methods -----
ReturnType: Int32, Name: CompareTo, Parameter: Object
ReturnType: Int32, Name: CompareTo, Parameter: Int32
ReturnType: Boolean, Name: Equals, Parameter: Object
ReturnType: Boolean, Name: Equals, Parameter: Int32
ReturnType: Int32, Name: GetHashCode, Parameter:
ReturnType: String, Name: ToString, Parameter:
ReturnType: String, Name: ToString, Parameter: String
ReturnType: String, Name: ToString, Parameter: IFormatProvider
ReturnType: String, Name: ToString, Parameter: String, IFormatProvider
ReturnType: Boolean, Name: TryFormat, Parameter: Span`1, Int32&, ReadOnlySpan`1, IFormatProvider
ReturnType: Int32, Name: Parse, Parameter: String
ReturnType: Int32, Name: Parse, Parameter: String, NumberStyles
ReturnType: Int32, Name: Parse, Parameter: String, IFormatProvider
ReturnType: Int32, Name: Parse, Parameter: String, NumberStyles, IFormatProvider
ReturnType: Int32, Name: Parse, Parameter: ReadOnlySpan`1, NumberStyles, IFormatProvider
ReturnType: Boolean, Name: TryParse, Parameter: String, Int32&
ReturnType: Boolean, Name: TryParse, Parameter: ReadOnlySpan`1, Int32&
ReturnType: Boolean, Name: TryParse, Parameter: String, NumberStyles, IFormatProvider, Int32&
ReturnType: Boolean, Name: TryParse, Parameter: ReadOnlySpan`1, NumberStyles, IFormatProvider, Int32&
ReturnType: TypeCode, Name: GetTypeCode, Parameter:
ReturnType: Type, Name: GetType, Parameter:
----- Properties -----
μ΄λ κ² Int32μ μλ μΈν°νμ΄μ€, νλ, λ©μλμ λν μ 보λ€μ΄ μ λμ€κ² λλ€.
μ΄λ²μ μ§μ classλ₯Ό λ§λ€μ΄ κ·Έ κ°μ²΄μ λν μ 보λ₯Ό λ½μ보μ
class Inventory
{
public string? Product { get; set; }
public int Count { get; set; }
}
Inventory inventory = new Inventory();
Type type2 = inventory.GetType();
Console.WriteLine(type2.Name); // Inventory
PrintInterfaces(type2);
PrintFields(type2);
PrintMethods(type2);
PrintProperties(type2);
Inventory
----- Interfaces -----
----- Fields -----
Access: Private, Type: String, Name: <Product>k__BackingField
Access: Private, Type: Int32, Name: <Count>k__BackingField
----- Methods -----
ReturnType: String, Name: get_Product, Parameter:
ReturnType: Void, Name: set_Product, Parameter: String
ReturnType: Int32, Name: get_Count, Parameter:
ReturnType: Void, Name: set_Count, Parameter: Int32
ReturnType: Type, Name: GetType, Parameter:
ReturnType: String, Name: ToString, Parameter:
ReturnType: Boolean, Name: Equals, Parameter: Object
ReturnType: Int32, Name: GetHashCode, Parameter:
----- Properties -----
Type: String, Name: Product
Type: Int32, Name: Count
μ΄λ κ² λ§λ νλλ€κ³Ό get set λ©μλ, κ·Έλ¦¬κ³ νλ‘νΌν°κΉμ§ λͺ¨λ μμλΌ μ μλ€.
SetValue()
κ°μ Getν΄μ¬ μ μλ€λ©΄, Setν μλ μλ€.
μκΉ μ΄ GetProperty() λ©μλλ‘ νλ‘νΌν°λ₯Ό κ°μ Έμμ SetValue() λ©μλλ‘ κ°μ μ€μ νλ©΄ λλ€.
PropertyInfo productProperty = typeof(Inventory).GetProperty("Product");
PropertyInfo countProperty = typeof(Inventory).GetProperty("Count");
productProperty.SetValue(inventory, "Example Product");
countProperty.SetValue(inventory, 10);
μ 체 μ½λλ Githubμ μ¬λ €λ¨μ΅λλ€
'π₯οΈ > C#' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[C#] 리νλ μ (Reflection): λμ λ©μλ μμ±νκΈ° (3) | 2023.10.11 |
---|---|
[C#] 리νλ μ (Reflection): λμ μΈμ€ν΄μ€ μμ±νκΈ° (0) | 2023.10.10 |
[μ΄κ²μ΄ C#μ΄λ€] Chapter15: μ°μ΅λ¬Έμ (LINQ) (0) | 2023.10.05 |
[C#] λλ€μκ³Ό Func, Action λ리μ (0) | 2023.09.18 |
[C#] λ리μ(delegate)μ μ΄λ²€νΈ (0) | 2023.09.10 |