* 리플렉션
// 리플렉션은 객체의 형식 정보를 보는 기능이다.
// object는 모든 데이터의 조상이라 모든 데이터형은 object 형태를 가지고 있다.
// 그중 tostring()이나 gettype()이 있음
// 상속한 인터페이스, 필드, 프로퍼티, 메서드 정도 출력하는 방법을 알아봄
class MainApp
{
static void interf(Type ty)
{
Console.WriteLine("---인터페이스---");
Type[] ty2 = ty.GetInterfaces();
foreach (Type i in ty2)
{
Console.WriteLine("이름:{0}",i.Name);
}
Console.WriteLine();
}
static void meth(Type ty)
{
Console.WriteLine("---메서드---");
MethodInfo[] ty2 = ty.GetMethods();
foreach (MethodInfo i in ty2)
{
Console.Write("이름:{0,-20} 리턴형:{1, -15} 파라미터:", i.Name, i.ReturnType.Name);
ParameterInfo[] para = i.GetParameters();
for (int j = 0; j < para.Length; j++)
{
Console.Write("{0}", para[j].ParameterType.Name);
if (para.Length-1 > j)
{
Console.Write(", ");
}
}
Console.WriteLine();
}
Console.WriteLine();
}
static void prop(Type ty)
{
Console.WriteLine("---프로퍼티---");
PropertyInfo[] ty2 = ty.GetProperties();
foreach (PropertyInfo i in ty2)
{
Console.WriteLine("이름:{0} 타입:{1}", i.Name, i.PropertyType.Name);
}
Console.WriteLine();
}
static void Field(Type ty)
{
Console.WriteLine("---필드---");
FieldInfo[] ty2 = ty.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static); // 어떤 한정자를 보여줄 지 선택하는거다. nonpublic은 protected와 private임
foreach (FieldInfo i in ty2)
{
// i.IsPublic 한정자 구분
Console.WriteLine("이름:{0, -20} 타입:{1}", i.Name,i.FieldType.Name);
}
Console.WriteLine();
}
static void Main(string[] args)
{
string a = "";
Type ty = a.GetType(); // system.string
interf(ty);
meth(ty);
prop(ty);
Field(ty);
}
}
// gettype으로 선택된 string에 대한 리플렉션을 뽑은 것이다.
// 객체에 대한 정보를 알 수 있다.