还记得当初面试的时候,面试官还问了我对反射的理解的。当时,只知道 有这个东西,却不知道怎么用。今天特地研究了下。
就我的理解是:可以在运行中获得程序的成员。
简单用反射的步骤:1.先获取该程序的名字。Assembly a = Assembly.LoadFrom (“ReflectionExample.exe”);
2.再获取该程序中的类。Type[ ] mytypes = a.GetTypes( );
3.再就可以获取该类中的方法了。
MethodInfo[] mif = ht.GetMethods();
foreach(MethodInfo mf in mif)
{
System.Console.WriteLine(mf.Name);
}
如果要调用该类中的一个具体方法,这里以构造函数为例:
1.创建一个该类型的实例。Type ht=typeof(HelloWord); Object obj = Activator.CreateInstance(ht);---HelloWord是该类型名
2.获取要实现的方法。 MethodInfo mSayHello = ht.GetMethod("SayHello");
3.实现。mSayHello.Invoke(obj, null);
若要实现带参数的构造函数:
1.给参数赋值。string[] s ={ "圣诞老人"};
2.创建一个该类型的实例。Object objName = Activator.CreateInstance(ht, s);
3.获取要实现的方法。 MethodInfo mSayHello = ht.GetMethod("SayHello");
4.mSayHello.Invoke(objName, null);
刚刚开始学习反射,请大家多多指导。
以下是此实例的所有代码:
using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;
namespace ConsoleReflectionExam
{
class Program
{
[STAThread] //指示应用程序的COM线程模型是单线程单元(STA)
static void Main(string[] args)
{
Console.WriteLine("列出程序集中的所有类型:");
Assembly a = Assembly.LoadFrom("ConsoleReflectionExam.exe");
Type[] myTypes = a.GetTypes();
foreach (Type t in myTypes)
{
Console.WriteLine(t.FullName);
}
Console.ReadKey();
Console.WriteLine("列出HelloWord中的所有方法:");
Type ht=typeof(HelloWord);
MethodInfo[] mif = ht.GetMethods();
foreach (MethodInfo mf in mif)
{
Console.WriteLine(mf.Name);
}
Console.ReadKey();
Console.WriteLine("实例化HelloWord,并且调用SayHello方法 ");
Object obj = Activator.CreateInstance(ht);
MethodInfo mSayHello = ht.GetMethod("SayHello");
mSayHello.Invoke(obj, null);
string[] s ={ "圣诞老人"};
Object objName = Activator.CreateInstance(ht, s);
BindingFlags flags = BindingFlags.InvokeMethod;
mSayHello.Invoke(objName, null);
Console.ReadKey();
}
}
public class HelloWord
{
string myName = null;
public HelloWord(string name)
{
myName = name;
}
public HelloWord()
: this(null)
{
}
public string Name
{
get
{
return myName;
}
}
public void SayHello()
{
if (myName == null)
{
Console.WriteLine("Hello Word");
}
else
{
Console.WriteLine("Hello {0}",myName);
}
}
}
}