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