在c sharp中使用反射和流阅读器
本文关键字:反射 sharp | 更新日期: 2023-09-27 18:07:17
我有一个关于c sharp反射的问题,这是我的问题
1)定义MyClass类,它有不同的字段和不同的访问器(private, public, protected),方法有不同的参数集和返回类型
2)定义MyTestClass,其中包含方法,做以下事情:打印指定类名的方法名,其中方法包含字符串参数,类名是字符串值。调用类的某个方法,并将参数放入方法,参数应该从文本文件中读取(类名和方法名是方法的参数
)我已经回答了这个问题,但我有一个问题,我不能从文本文件中读取,当我运行文本文件内的程序有一个双数字和一个整数,但它没有显示在控制台上这是我的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.IO;
class MyClass
{
private int i;
public double d;
private string s;
public bool b;
public MyClass()
{
i = 1;
d = 0.1;
s = "1";
b = true;
}
public void Method0()
{
Console.WriteLine("Method with no arguments, no return value.");
}
private int Method1(int arg0)
{
Console.WriteLine("The method returns int, int gets.");
return arg0;
}
private double Method2(int arg0, double arg1)
{
Console.WriteLine("Method returns a double, taking int and double.");
return arg1 * arg0;
}
public bool Method3(string arg0)
{
Console.WriteLine("Method returns a bool, accepts string");
return arg0.Length>10;
}
public bool Method3(string arg0,string arg1)
{
Console.WriteLine("The method takes two arguments string.");
return arg0 == arg1;
}
public static char Method4(string arg0)
{
Console.WriteLine("Method returns a char, accepts string. .");
return arg0[1];
}
public void Method5(int arg0, double arg1)
{
Console.WriteLine("arg1 = {0} arg2 = {1}.",arg0,arg1);
}
}
class MyTestClass
{
public static string[] GetMethodsWithStrParams(string className)
{
var t = Type.GetType(className);
List<string> res = new List<string>();
foreach (var method in t.GetMethods())
{
foreach (var param in method.GetParameters())
{
if (param.ParameterType == typeof(string))
{
res.Add(method.Name);
break;
}
}
}
return res.ToArray();
}
public static void InvokeMethod(string className, string methodName, string fileName)
{
var t = Type.GetType(className);
using (StreamReader f = new StreamReader("params.txt"))
{
t.GetMethod(methodName).Invoke(t.GetConstructor(Type.EmptyTypes).Invoke(new object[] { }),
new object[] { f.ReadLine() });
}
}
}
class Program
{
static void Main(string[] args)
{
string name = "MyClass";
foreach (var x in MyTestClass.GetMethodsWithStrParams(name))
{
Console.WriteLine(x);
}
MyTestClass.InvokeMethod("MyClass", "Method4", "params.txt");
Console.ReadKey(true);
}
}
这是我运行程序
时的输出method3
method3
method4
Method returns a char, accepts string. .
但是在params.txt里面有
10 1.5
一些建议:
将反射部分分成两部分:1)对象的构造;2)方法的调用。这使得代码更加清晰,并且您可以在调用next方法时重用该对象。
f.ReadLine()
返回一个字符串。它不会自动将其拆分为单独的参数。new object[] { f.ReadLine() }
给出了一个具有单个字符串值的对象数组。
您需要自己用分隔符将该行分割成单独的值。然后,您需要将这些单独的字符串转换为方法所需的参数类型。
我在visual Studio中运行你的代码,我唯一的问题是文件名。其余的似乎在原则上是有效的。文件params.txt肯定在可执行文件夹中吗?如果没有,则需要提供完整的路径。
MyTestClass.InvokeMethod("MyClass", "Method4", "c:''params.txt");
另一个问题是?MyClass是否存在于名称空间中?如果是这样,则需要使用名称空间返回Type对象:
MyTestClass.InvokeMethod("MyNamespace.MyClass", "Method4", "c:''params.txt");
我还注意到,尽管方法InvokeMethod接受文件名作为参数,它有一个硬编码的文件名。因此,它忽略通过调用code(在main方法中)传递的文件名。