Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438

Исключения и System.Reflection

17.08.2011, 20:18. Показов 1641. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем возникает исключение при компиляции,не пойму почему. Исключение - индекс находится вне границ массива,строка 77

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
 
namespace ConsoleApplication1
{
    class MyClass
    {
        int x, y;
 
        public MyClass(int i, int j)
        {
            x = i;
            y = j;
        }
 
        public int summa()
        {
            return x + y;
        }
 
        public bool IsBetween(int i)
        {
            if ((i > x) & (i < y)) return true;
            return false;
        }
 
        public void set(int a, int b)
        {
            x = a;
            y = b;
        }
 
        public void set(double a, double b)
        {
            x = (int)a;
            y = (int)b;
        }
 
        public void show()
        {
            Console.WriteLine("x :{0}, y :{1}", x, y);
        }
    }
 
    class ReflectDemo
    {
        public static void Main(string[] args)
        {
            int val;
            MyClass ReflectOb=new MyClass (10,20);
            Type t = typeof(MyClass);
 
            Console.WriteLine("Анализ методов,определённых в " + t.Name);
            Console.WriteLine("Поддерживаемые методы :");
 
            MethodInfo[] mi = t.GetMethods();
            foreach (MethodInfo v in mi)
            {
                ParameterInfo[] ni = v.GetParameters();
 
                if (v.Name.CompareTo("summa") == 0)
                {
                    val = (int)v.Invoke(ReflectOb, null);
                }
 
                else if (v.Name.CompareTo("IsBetween") == 0)
                {
                    object[] ar = new object[1];
                    ar[0] = 15;
                    if ((bool)v.Invoke(ReflectOb, ar)) Console.WriteLine("15 находится между x и y");
                }
 
                else if (v.Name.CompareTo("set") == 0 & ni[0].ParameterType == typeof(int)) //Вот тут
                {
                    object[] ar = new object[2];
                    ar[0] = 14;
                    ar[1] = 12;
                    v.Invoke(ReflectOb, ar);
                }
 
                else if (v.Name.CompareTo("set") == 0 & ni[0].ParameterType == typeof(int))
                {
                    object[] ar = new object[2];
                    ar[0] = 1.1;
                    ar[2] = 2.2;
                    v.Invoke(ReflectOb, ar);
                }
 
                else if (v.Name.CompareTo("show") == 0)
                {
                    v.Invoke(ReflectOb, null);
                }       
            }
            Console.ReadKey();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.08.2011, 20:18
Ответы с готовыми решениями:

System reflection
Как с помощью System reflection добавить поле в класс?

О производительности System.Reflection
Приветствую. Читал как-то что результаты рефлексии кешируются. Есть необходимость обращаться к классу в пространстве имен, но...

Получить информацию System.Environment используя Reflection
Привет всем. Нужно получить и напечатать информацию System.Environment использовав reflection))) C# начал изучать 3 дня назад,и очень...

12
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
17.08.2011, 20:23
Пройдитесь отладчиком, уверен на 80% что массив ni - пустой.
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.08.2011, 20:35  [ТС]
Цитата Сообщение от umnick_kh Посмотреть сообщение
Пройдитесь отладчиком, уверен на 80% что массив ni - пустой.
Оказалось и правда,что он почему то пустой..
0
 Аватар для umnick_kh
311 / 249 / 44
Регистрация: 06.12.2010
Сообщений: 527
17.08.2011, 20:43
NowMatrix, ну так пройдитесь отладчиком по всей программе, так и узнаете, почему.
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.08.2011, 21:35  [ТС]
В общем ничего не получилось..не пойму всё равно.

Добавлено через 7 минут
И если допустим в цикле отобразить все параметры,то всё хорошо, а доступ к конкретному параметру не через цикл-запрещён..
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.08.2011, 21:39
Цитата Сообщение от NowMatrix Посмотреть сообщение
В общем ничего не получилось..не пойму всё равно.
плохо прошлись, еще раз пройдите наблюдая значения переменных в вотче
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.08.2011, 21:49  [ТС]
Ребят я отладчиком почти никогда не пользовался,искал ошибки всегда вручную. И в строке 63 массив ParameterInfo написано,что принимает 2 параметра!..Укажите на ошибку пожалуйста)
0
Каратель
Эксперт С++
6610 / 4029 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
17.08.2011, 21:51
клавиши F10/F11 в тебе в помощь
0
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
17.08.2011, 22:55  [ТС]
Всё равно не могу найти ошибку,ткните носом меня пожалуйста)).Я просто не так давно изучаю самостоятельно программирование и не особо силён в нём.
0
67 / 67 / 9
Регистрация: 18.04.2011
Сообщений: 124
17.08.2011, 23:05
NowMatrix, эээ... вам не кажется, что все логично?)

Первым в цикле у вас идет вот этот метод:
C#
1
2
3
4
        public int summa()
        {
            return x + y;
        }
Ну так у него и нет параметров) Поэтому массив
C#
1
 ParameterInfo[] ni = v.GetParameters();
весьма естественным образом пустой)
0
 Аватар для atomohod
20 / 20 / 3
Регистрация: 01.04.2010
Сообщений: 57
17.08.2011, 23:07
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
 
namespace ConsoleApplication1
{
    class MyClass
    {
        int x, y;
 
        public MyClass(int i, int j)
        {
            x = i;
            y = j;
        }
 
        public int summa()
        {
            return x + y;
        }
 
        public bool IsBetween(int i)
        {
            if ((i > x) & (i < y)) return true;
            return false;
        }
 
        public void set(int a, int b)
        {
            x = a;
            y = b;
        }
 
        public void set(double a, double b)
        {
            x = (int)a;
            y = (int)b;
        }
 
        public void show()
        {
            Console.WriteLine("x :{0}, y :{1}", x, y);
        }
    }
 
    class ReflectDemo
    {
        public static void Main(string[] args)
        {
            int val;
            MyClass ReflectOb = new MyClass(10, 20);
            Type t = typeof(MyClass);
 
            Console.WriteLine("Анализ методов,определённых в " + t.Name);
            Console.WriteLine("Поддерживаемые методы :");
 
            MethodInfo[] mi = t.GetMethods();
            foreach (MethodInfo v in mi)
            {
                ParameterInfo[] ni = v.GetParameters();
 
                if (v.Name.CompareTo("summa") == 0)
                {
                    val = (int)v.Invoke(ReflectOb, null);
                }
 
                else if (v.Name.CompareTo("IsBetween") == 0)
                {
                    object[] ar = new object[1];
                    ar[0] = 15;
                    if ((bool)v.Invoke(ReflectOb, ar)) Console.WriteLine("15 находится между x и y");
                }
 
                else if (v.Name.CompareTo("set") == 0 && ni[0].ParameterType == typeof(int)) //Вот тут
                {
                    object[] ar = new object[2];
                    ar[0] = 14;
                    ar[1] = 12;
                    v.Invoke(ReflectOb, ar);
                }
 
                else if (v.Name.CompareTo("set") == 0 && ni[0].ParameterType == typeof(int))
                {
                    object[] ar = new object[2];
                    ar[0] = 1.1;
                    ar[2] = 2.2;
                    v.Invoke(ReflectOb, ar);
                }
 
                else if (v.Name.CompareTo("show") == 0)
                {
                    v.Invoke(ReflectOb, null);
                }
            }
            Console.ReadKey();
        }
    }
}
вот так все работает. & исправить на &&. Нужно объснять почему?

Добавлено через 1 минуту
кстати, объяснение на пост выше)
1
7 / 7 / 1
Регистрация: 04.08.2011
Сообщений: 16
17.08.2011, 23:28
Меняйте
C#
1
ni[0].ParameterType == typeof(int)
на
C#
1
(ni != null && ni[0].ParameterType == typeof(int))
Массив пуст для методов, которые входных параметров не принимают.

Есть еще вариант "поднять" в коде if'ы для методов, которые не возвращают параметры, но т.к. 3 из 4х стандартных методов параметров тоже не принимают, то их пришлось бы тоже проверять.
Edited: вариант выше еще лучше, не обратил внимание на одинарное & >_<
1
98 / 81 / 16
Регистрация: 14.01.2011
Сообщений: 438
18.08.2011, 04:48  [ТС]
somethingrotten,
Ну я бы так не сказал.
Сначала мы получаем массив методов,потом пробегаемся в цикле по этим методам.При каждой итерации цикла создаём массив параметров данного метода.Первым у нас является метод summa,т.е.
mi[0],но у нас есть много условий,если вы не заметили. В методе summa у нас нет параметров и этим кодом мы вызываем этот метод,не затрагивая параметры,т.к. их нет.Об этом свидетельствует один из аргументов Invoke-null
C#
1
2
3
4
if (v.Name.CompareTo("summa") == 0)
                {
                    val = (int)v.Invoke(ReflectOb, null);
                }
Добавлено через 59 минут
Всем спасибо,разобрался.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.08.2011, 04:48
Помогаю со студенческими работами здесь

Какие есть книги про System Reflection?
Ничего не могу найти толкового...

BackgroundWorker + GetFiles(., ., SearchOption.AllDirectories) = System.Reflection.TargetInvocationException
Сделал асинхронный метод, который контролируется BackgroundWorker и добавил в него поиск файла в директории через Directory.GetFiles(...). ...

Обработка исключения System.IndexOutOfRangeException
Добрый вечер) Возникла проблема с исключением. По смыслу - с клавиатуры вводится строка, которую я преобразую в массив символов и потом...

Обработка исключения System.FormatException
Необработанное исключение типа &quot;System.FormatException&quot; в mscorlib.dll Дополнительные сведения: Входная строка имела неверный формат. ...

Исключения System.IO, занят другим процессом
Подскажите пл. какое исключение обрабатывать если каталог (и, или) файл в нём, для удаления занят другим процессом: public...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru