예제 #1
0
        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();
        }
예제 #2
0
        ////////////////////////////////////////////////////////////////////////////

        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();
        }