static void Main(string[] args) { part1.Handle(); Type t = typeof(ForInspection); Console.WriteLine("Тип " + t.FullName + " унаследован от " + t.BaseType.FullName); Console.WriteLine("Пространство имен " + t.Namespace); Console.WriteLine("Находится в сборке " + t.AssemblyQualifiedName); Console.WriteLine("\nКонструкторы:"); foreach (var x in t.GetConstructors()) { Console.WriteLine(x); } Console.WriteLine("\nМетоды:"); foreach (var x in t.GetMethods()) { Console.WriteLine(x); } Console.WriteLine("\nСвойства:"); foreach (var x in t.GetProperties()) { Console.WriteLine(x); } Console.WriteLine("\nПоля данных (public):"); foreach (var x in t.GetFields()) { Console.WriteLine(x); } Console.WriteLine("\nСвойства, помеченные атрибутом:"); foreach (var x in t.GetProperties()) { object attrObj; if (GetPropertyAttribute(x, typeof(NewAttribute), out attrObj)) { NewAttribute attr = attrObj as NewAttribute; Console.WriteLine(x.Name + " - " + attr.Description); } } Console.WriteLine("\nВызов метода:"); //Создание объекта //ForInspection fi = new ForInspection(); //Можно создать объект через рефлексию ForInspection fi = (ForInspection)t.InvokeMember(null, BindingFlags.CreateInstance, null, null, new object[] { }); //Параметры вызова метода object[] parameters = new object[] { 3, 2 }; //Вызов метода object Result = t.InvokeMember("Plus", BindingFlags.InvokeMethod, null, fi, parameters); Console.WriteLine("Plus(3,2)={0}", Result); Console.ReadLine(); }
//////////////////////////////////////////////////////////////////////////// static void Main(string[] args) { //////////////////////////////////////////////////////////////////////// Console.WriteLine("\nДЕЛЕГАТЫ\n"); int i1 = 3; int i2 = 2; PlusOrMinusMethod("Плюс: ", i1, i2, Plus); PlusOrMinusMethod("Минус: ", i1, i2, Minus); // Создание экземпляра делегата на основе метода PlusOrMinus pm1 = new PlusOrMinus(Plus); PlusOrMinusMethod("Создание экземпляра делегата на основе метода: ", i1, i2, pm1); // Создание экземпляра делегата на основе 'предположения' делегата // Компилятор 'пердполагает' что метод Plus типа делегата PlusOrMinus pm2 = Plus; PlusOrMinusMethod("Создание экземпляра делегата на основе 'предположения' делегата: ", i1, i2, pm2); // Создание анонимного метода PlusOrMinus pm3 = delegate(int param1, int param2) { return(param1 + param2); }; PlusOrMinusMethod("Создание экземпляра делегата на основе анонимного метода: ", i1, i2, pm2); PlusOrMinusMethod("Создание экземпляра делегата на основе лямбдавыражения 1: ", i1, i2, (int x, int y) => { int z = x + y; return(z); }); PlusOrMinusMethod("Создание экземпляра делегата на основе лямбдавыражения 2: ", i1, i2, (x, y) => { return(x + y); }); PlusOrMinusMethod("Создание экземпляра делегата на основе лямбдавыражения 3: ", i1, i2, (x, y) => x + y); Console.WriteLine("\nИспользование обощенного делегата Func<>"); PlusOrMinusMethodFunc("Создание экземпляра делегата на основе метода: ", i1, i2, Plus); string OuterString = "ВНЕШНЯЯ ПЕРЕМЕННАЯ"; PlusOrMinusMethodFunc("Создание экземпляра делегата на основе лямбдавыражения 1: ", i1, i2, (int x, int y) => { Console.WriteLine("Эта переменная объявлена вне лямбдавыражения: " + OuterString); int z = x + y; return(z); }); PlusOrMinusMethodFunc("Создание экземпляра делегата на основе лямбдавыражения 2: ", i1, i2, (x, y) => { return(x + y); }); PlusOrMinusMethodFunc("Создание экземпляра делегата на основе лямбдавыражения 3: ", i1, i2, (x, y) => x + y); // Групповой делегат всегда возвращает значение типа void Console.WriteLine("Пример группового делегата"); Action <int, int> a1 = (x, y) => { Console.WriteLine("{0} + {1} = {2}", x, y, x + y); }; Action <int, int> a2 = (x, y) => { Console.WriteLine("{0} - {1} = {2}", x, y, x - y); }; Action <int, int> group = a1 + a2; group(5, 3); Action <int, int> group2 = a1; Console.WriteLine("Добавление вызова метода к групповому делегату"); group2 += a2; group2(10, 5); Console.WriteLine("Удаление вызова метода из группового делегата"); group2 -= a1; group2(20, 10); //////////////////////////////////////////////////////////////////////// Console.WriteLine("\nРЕФЛЕКСИЯ\n"); Type t = typeof(ForInspection); Console.WriteLine("Тип " + t.FullName + " унаследован от " + t.BaseType.FullName); Console.WriteLine("Пространство имен " + t.Namespace); Console.WriteLine("Находится в сборке " + t.AssemblyQualifiedName); Console.WriteLine("\nКонструкторы:"); foreach (var x in t.GetConstructors()) { Console.WriteLine(x); } Console.WriteLine("\nМетоды:"); foreach (var x in t.GetMethods()) { Console.WriteLine(x); } Console.WriteLine("\nСвойства:"); foreach (var x in t.GetProperties()) { Console.WriteLine(x); } Console.WriteLine("\nПоля данных (public):"); foreach (var x in t.GetFields()) { Console.WriteLine(x); } Console.WriteLine("\nСвойства, помеченные атрибутом:"); foreach (var x in t.GetProperties()) { object attrObj; if (GetPropertyAttribute(x, typeof(NewAttribute), out attrObj)) { NewAttribute attr = attrObj as NewAttribute; Console.WriteLine(x.Name + " - " + attr.Description); } } Console.WriteLine("\nВызов метода:"); // Создание объекта // ForInspection fi = new ForInspection(); // Можно создать объект через рефлексию ForInspection fi = (ForInspection)t.InvokeMember(null, BindingFlags.CreateInstance, null, null, new object[] { }); // Параметры вызова метода object[] parameters = new object[] { 3, 2 }; // Вызов метода object Result = t.InvokeMember("Plus", BindingFlags.InvokeMethod, null, fi, parameters); Console.WriteLine("Plus(3,2)={0}", Result); Console.ReadLine(); }