Работа с рефлексией,Выбивает исключение,ругается на параметры - C#
Формулировка задачи:
1) Описать класс MyClass, который будет содержать:
• поля различных типов и различным уровнем доступа;
• методы, с различным набором аргументов и различным типом возвращаемого значения.
2) Объявить класс MyTestClass, который будет содержать методы выполняющие следующие действия:
• выводить по имени класса имена методов, которые содержат строковые параметры (имя класса передается в качестве аргумента);
• вызывать некоторый метод класса, при этом значения для его параметров необходимо прочитать из текстового файла (имя класса и имя метода передаются в качестве аргументов).
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(); } } }
Решение задачи: «Работа с рефлексией,Выбивает исключение,ругается на параметры»
textual
Листинг программы
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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д