Работа с рефлексией,Выбивает исключение,ругается на параметры - 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();
        }
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.714 из 5
Похожие ответы