0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 85
1

Работа с рефлексией,Выбивает исключение,ругается на параметры

20.09.2015, 17:36. Показов 4888. Ответов 5
Метки нет (Все метки)

1) Описать класс MyClass, который будет содержать:
• поля различных типов и различным уровнем доступа;
• методы, с различным набором аргументов и различным типом возвращаемого значения.
2) Объявить класс MyTestClass, который будет содержать методы выполняющие следующие действия:
• выводить по имени класса имена методов, которые содержат строковые параметры (имя класса передается в качестве аргумента);
• вызывать некоторый метод класса, при этом значения для его параметров необходимо прочитать из текстового файла (имя класса и имя метода передаются в качестве аргументов).



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
101
102
103
104
105
106
107
108
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading.Tasks;
 
namespace LabWork_1
{
    public class MyClass
    {
        public int pole1;
        protected double pole2;
        private string pole3;
        internal int pole4;
 
        public MyClass()
        {
        pole1=0;
        pole2=0.0;
        pole3="";
        pole4=0;
        }
 
        public MyClass(int pl1,double pl2,string pl3,int pl4)
        {
            pole1 = pl1;
            pole2 = pl2;
            pole3=pl3;
            pole4 = pl4;
        }
 
        public string MyProperties
        {
            get { return pole3; }
            set { pole3 = value; }
        }
 
        public int Method1(int p1,int p4)
        {
            return p1 + p4;
        }
 
       public double Method2(double p2)
        {
           p2=4.5;
           pole2=p2;
           return pole2;
        }
 
       public string  Method3(string p3)
        {
           p3="Донской Государственный Технический Университет";
           pole3=p3;
           return pole3;
        }
 
        public void Method4()
        {
            Console.WriteLine("Вещественное число{0}",pole2);
            Console.WriteLine("Строка{0}",pole3);
        }
        
 
    }
 
    public class MyTestClass
    {
 
        public void MethodA(Type t,MyClass reflectOb)
        {
            Console.WriteLine("Вызов методов");
            MethodInfo[] mi = t.GetMethods();
            foreach (MethodInfo m in mi)
            {
                ParameterInfo[] pi = m.GetParameters();
                if (m.Name.CompareTo("Method3") == 0 && pi[0].ParameterType == typeof(string))
                {
                    object[] args = new object[2];
                    m.Invoke(reflectOb,args);--------------->Необработанное исключение тип "System.Reflection.TargetParameterCountException" в mscorlib.dll
Дополнительные сведения: Несоответствие числа параметров.
                }
            }
        }
 
        public void MethodB(MyClass m)
        {
 
        }
 
 
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(MyClass);
            MyClass reflectOb=new MyClass();
            MyTestClass mtc = new MyTestClass();
            mtc.MethodA(t,reflectOb);
            ///mtc.MethodA(t,reflectOb,args);;
           /// mtc.;
            Console.ReadKey();
        }
    }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2015, 17:36
Ответы с готовыми решениями:

Работа с рефлексией, атрибуты применяемые к свойствам
Описываю класс атрибута, который будет применяться к свойствам классов. Можно ли в классе атрибута...

Reflection выбивает исключение
Подскажите что в строке 19 и 24 сделано не так, выбивают исключения не пойму почему using...

Привязка сущности к контексту выбивает исключение
Всем привет. В своем проекте использую EntityFramework и столкнулся с необъяснимым мне поведением...

Directory.Move() выбивает исключение, подскажите что не так
Функция по перемещению директории выбивает ошибку, подскажите- что не так? static void...

5
Каратель
Эксперт С++
6607 / 4026 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
21.09.2015, 14:42 2
Цитата Сообщение от Yildirim Посмотреть сообщение
C#
1
public string Method3(string p3)
сколько параметров?
Цитата Сообщение от Yildirim Посмотреть сообщение
C#
1
2
object[] args = new object[2];
m.Invoke(reflectOb,args);
а сколько аргументов передаешь?
0
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 85
21.09.2015, 22:13  [ТС] 3
При таком варианте
C#
1
m.Invoke(reflectOb);
Он выведет ошибку Ни одна из перегрузок метода "Invoke" не принимает "1" аргументов

Я пытался все варианты.Просто сейчас я в тупике и нужна подсказка,как выйти из тупика.
0
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 85
22.09.2015, 09:01  [ТС] 4
Немного подправил но всё равно ошибки,прикреплённый файл это для считывания параметров

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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading.Tasks;
 
namespace LabWork_1
{
    public class MyClass
    {
        public int pole1;
        protected double pole2;
        private string pole3;
        internal int pole4;
 
        public MyClass()
        {
        pole1=0;
        pole2=0.0;
        pole3="";
        pole4=0;
        }
 
        public MyClass(int pl1,double pl2,string pl3,int pl4)
        {
            pole1 = pl1;
            pole2 = pl2;
            pole3=pl3;
            pole4 = pl4;
        }
 
        public string MyProperties
        {
            get { return pole3; }
            set { pole3 = value; }
        }
 
        public int Method1(int p1,int p4)
        {
            return p1 + p4;
        }
 
       public double Method2(double p2)
        {
           p2=4.5;
           pole2=p2;
           return pole2;
        }
 
       public string  Method3(string p3)
        {
           p3="Донской Государственный Технический Университет";
           pole3=p3;
           return pole3;
        }
 
        public void Method4()
        {
            Console.WriteLine("Вещественное число{0}",pole2);
            Console.WriteLine("Строка{0}",pole3);
        }
        
 
    }
 
    public class MyTestClass
    {
 
        public void MethodA(Type t,MyClass reflectOb)///методы выводящий по имени класса имена методов, которые содержат строковые параметры 
 
        {
            Console.WriteLine("Вызов методов");
            MethodInfo[] mi = t.GetMethods();
            foreach (MethodInfo m in mi)
            {
                ParameterInfo[] pi = m.GetParameters();
                if (m.Name.CompareTo("Method3") == 0 && pi[0].ParameterType == typeof(string))
                {
                    object[] args = new object[1];
                    m.Invoke(reflectOb,p3);
                }
            }
        }
 
        public void MethodB(MyClass m)///метод класса,cчитывающий свои параметры из текстового файла 
        {
            int i;
            try
            {
                using (StreamWriter sw = new StreamWriter("file.txt"))
                {
                    foreach (MethodInfo mi in T.GetMethods())
                    {
                        ParameterInfo[] pi = mi.GetParameters();
 
                        sw.Write("{0} {1} {2} (", T.Name, mi.ReturnType.Name, mi.Name);
                        i = 0;
                        if (pi.Length > 0)
                        {
                            while (i < pi.Length)
                            {
                                sw.Write("{0}", pi[i].ParameterType);
                                i++;
                                if (i < pi.Length)
                                {
                                    sw.Write(", ");
                                }
                            }
                            sw.WriteLine(")");
                        }
                        else
                            sw.WriteLine(")");
                    }
                    foreach (FieldInfo fi in T.GetFields())
                    { sw.WriteLine(fi); }
                }
            }
            catch (Exception ex) { Console.WriteLine(ex.Message); }
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Type t = typeof(MyClass);
            MyClass reflectOb=new MyClass();
            MyTestClass mtc = new MyTestClass();
            mtc.MethodA(t,reflectOb);
            ///mtc.MethodA(t,reflectOb,args);;
           mtc.MethodB(MyClass m);
            Console.ReadKey();
        }
    }
}
Список ошибок
Элемент "T" не существует в текущем контексте.
Элемент "m" не существует в текущем контексте.
Имя "p3" отсутствует в текущем контексте

И никак не могу понять как можно реализовать МетодА с помощью рефлексии,Invoke ругается на параметры передаваемые.
Вложения
Тип файла: txt file.txt (381 байт, 13 просмотров)
0
Каратель
Эксперт С++
6607 / 4026 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
22.09.2015, 11:25 5
Цитата Сообщение от Yildirim Посмотреть сообщение
Имя "p3" отсутствует в текущем контексте
что такое p3 и почему оно передается в Invoke?

Добавлено через 53 секунды
Цитата Сообщение от Yildirim Посмотреть сообщение
Элемент "T" не существует в текущем контексте.
что такое T и откуда оно там взялось?

Добавлено через 38 секунд
и финальный вопрос что такое m и откуда оно там взялось?
0
0 / 0 / 0
Регистрация: 30.01.2011
Сообщений: 85
24.09.2015, 09:36  [ТС] 6
p3 это поле строка,я хочу с помощью рефлексии вывести метод с этим полем,точнее уже переданным строковым параметром.

mi - переменная которую я использую для перебора с помощью цикла foreach ,то есть я перебираю в массиве все методы,с нужным мне параметром.

T- пространство имён System.Type,то есть я обозначаю с каким классом я намерен работать.

У меня MyClass содержит строковое поле,с помощью свойства я его немного открываю,затем передаю в параметр некоторого метода Method3

А уж потом,я создаю новый класса и уже хочу написать метод,который будет с помощью рефлексии поэтому я Invoke и применяю,чтобы с помощью рефлексии мне выдало именно этот метод со строкой-параметром.

Поэтому и применяю foreach,MethodInfo mi

Добавлено через 23 часа 17 минут
И снова изменил немного теперь компилятор ругается

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
101
102
103
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading.Tasks;
 
namespace LabWork_1
{
    public class MyClass
    {
        public int pole1;
        protected double pole2;
        private string pole3;
        internal int pole4;
 
        public MyClass()
        {
        pole1=0;
        pole2=0.0;
        pole3="";
        pole4=0;
        }
 
        public MyClass(int pl1,double pl2,string pl3,int pl4)
        {
            pole1 = pl1;
            pole2 = pl2;
            pole3=pl3;
            pole4 = pl4;
        }
 
        public string MyProperties
        {
            get { return pole3; }
            set { pole3 = value; }
        }
 
        public int Method1(int p1,int p4)
        {
            return p1 + p4;
        }
 
       public double Method2(double p2)
        {
           p2=4.5;
           pole2=p2;
           return pole2;
        }
 
       public string  Method3(string p3)
        {
           p3="Донской Государственный Технический Университет";
           pole3=p3;
           return pole3;
        }
 
        public void Method4()
        {
            Console.WriteLine("Вещественное число{0}",pole2);
            Console.WriteLine("Строка{0}",pole3);
        }
        
 
    }
 
    public class MyTestClass:MyClass
    {
 
        public void MethodA(ref MyClass)///метод выводящий по имени класса имена методов, которые содержат строковые параметры ,ругается на ref Class  требуется идентификатор
 
        {
            Type mycl = Type.GetType("MyClass");
            Console.WriteLine("Вызов методов");
            MethodInfo mi = mycl.GetMethod("Method3");
            object myclvalue = mi.Invoke(mi,new object []{});
            Console.WriteLine("Метод со строковым параметром:{0}",myclvalue);
        }
 
          
 
        public void MethodB(ref MyClass)///Требуется идентификатор 
        {
 
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            //Type t = typeof(MyClass);
            ///MyClass reflectOb=new MyClass();
            MyTestClass mtc = new MyTestClass();
            mtc.MethodA(ref MyClass);-----Ошибка "LabWork_1.MyClass" является "тип", но используется как "переменная"   
            ///mtc.MethodA(t,reflectOb,args);;
          /// mtc.MethodB(ref MyClass);
            Console.ReadKey();
        }
    }
}
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.09.2015, 09:36
Помогаю со студенческими работами здесь

При создании двух макетов в документе Ругается на параметры
Приветствую Вас еще раз многоуважаемые форумчане Возникла еще одна проблемка кто может помогите...

Работа в другом форме , выбивает MScomm_Oncomm
Есть главный форм , на нем MSComm ,который выполняет определенную функцию, если я захожу в другой...

Написать функцию, проверяющую передаваемые параметры и генерирующую в случае надобности подходящее исключение
Функция, реализуемая в задании, обязана выполнять проверку передаваемых параметров и генерировать...

Необработанное исключение по адресу 0x4050D302 в ConsoleApplication17.exe: 0xC0000005: Access violation (параметры: 0x00000008)
Добрый вечер. Я в сети нашел программу градиентному методу дробления шага и изменил в ней функцию...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru