您的位置:首页 > 编程语言 > C#

C#高级编程 反射 代码示例

2016-01-14 15:20 507 查看
反射

反射(Reflection)是.NET中的重要机制,通过反射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。

还可以获得每个成员的名称、限定符和参数等。

设计模式中

采用反射技术可以简化工厂的实现

1.工厂方法:通过反射可以将需要实现的子类名称传递给工厂方法,这样无须在子类中实现类的实例化。

2.抽象工厂:使用反射可以减少抽象工厂的子类。

采用反射技术可以极大简化对象的生成

1.命令模式:可以采用命令的类型名称作为参数直接获得命令的实例,并且可以动态执行命令。

2.享元模式:采用反射技术实例化享元可以简化享元工厂。

反射演示代码,如下:

static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
//[STAThread]
static void Main()
{
//Application.EnableVisualStyles();
//Application.SetCompatibleTextRenderingDefault(false);
//Application.Run(new Form1());

System.Console.WriteLine("列出程序集中的所有类型");
//System.Reflection.Assembly 表示一个程序集,它是一个可重用、无版本冲突并且可自我描述的公共语言运行时应用程序构造块
Assembly a = Assembly.LoadFrom("Reflection.exe");
//类型声明
Type[] mytypes = a.GetTypes();

foreach (Type t in mytypes)
{
System.Console.WriteLine(t.Name);
}

System.Console.ReadLine();
System.Console.WriteLine("列出HellWord中的所有方法");

Type ht = typeof(HelloWorld);
// System.Reflection.MethodInfo 发现方法的属性并提供对方法元数据的访问
MethodInfo[] mif = ht.GetMethods();

foreach (MethodInfo mf in mif)
{
System.Console.WriteLine(mf.Name);
}

System.Console.ReadLine();
System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法");

//实例化HelloWorld
Object obj = Activator.CreateInstance(ht);
string[] s = { "zhenlei" };
//实例化HelloWorld
Object objName = Activator.CreateInstance(ht, s);
// System.Reflection.BindingFlags
//指定控制绑定和由反射执行的成员和类型搜索方法的标志。
//此枚举有一个 FlagsAttribute 特性,通过该特性可使其成员值按位组合。
BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);

MethodInfo msayhello = ht.GetMethod("SayHello");
msayhello.Invoke(obj, null);
msayhello.Invoke(objName, null);

System.Console.ReadLine();
System.Console.Read();
}
}
/// <summary>
/// HelloWorld类
/// </summary>
public class HelloWorld
{
string myName = null;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="name"></param>
public HelloWorld(string name)
{
myName = name;
}
/// <summary>
/// 构造函数
/// </summary>
public HelloWorld()
: this(null)
{ }
/// <summary>
/// 属性
/// </summary>
public string Name
{
get
{
return myName;
}
}
/// <summary>
/// 方法
/// </summary>
public void SayHello()
{
if (myName == null)
{
System.Console.WriteLine("Hello World");
}
else
{
System.Console.WriteLine("Hello," + myName);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: