Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.09.2015, 20:22   #1
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию Работа с рефлексией,ругается на параметры

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

p3 это поле строка,я хочу с помощью рефлексии вывести метод с этим полем,точнее уже переданным строковым параметром.

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

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

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

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();
        }
    }
}
Вложения
Тип файла: txt file.txt (381 байт, 121 просмотров)
Otar4ik вне форума Ответить с цитированием
Старый 24.09.2015, 09:43   #2
Otar4ik
Форумчанин
 
Регистрация: 16.04.2010
Сообщений: 123
По умолчанию

Немного изменил но всё равно выскакивают ошибки.


Код:
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,)///метод класса,cчитывающий свои параметры из текстового файла,ругается на ref Class  требуется идентификатор
        {
           
        }
    }

    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();
        }
    }
}
Otar4ik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Реализовать программу через параметры-значений и параметры-ссылок bufalo C# (си шарп) 3 14.12.2011 17:10
ПАРАМЕТРЫ-КОНСТАНТЫ, НЕТИПИЗИРОВАННЫЕ ПАРАМЕТРЫ ПОДПРОГРАММ, МАССИВЫ И СТРОКИ ОТКРЫТОГО ТИПА Юрий62 Помощь студентам 1 04.12.2011 14:09
Параметры запуcка. как обрабатывать параметры вида -somecmd "?" Человек_Борща Общие вопросы Delphi 1 15.01.2011 15:48
ПАРАМЕТРЫ-КОНСТАНТЫ, НЕТИПИЗИРОВАННЫЕ ПАРАМЕТРЫ ПОДПРОГРАММ, МАССИВЫ И СТРОКИ ОТКРЫТОГО ТИПА Kira09 Паскаль, Turbo Pascal, PascalABC.NET 0 19.12.2010 17:28
Работа с рефлексией: Нужна помощь Arnezami Общие вопросы .NET 3 02.11.2009 01:14