反射 运用
2011-05-15 10:36
211 查看
在使用之前了解一下相关知识。
介绍:
反射使用System.Reflection命名空间。此命名空间中几个类的关系需要先明白。
1) AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器.
2) Assembly:程序集类
3) Module:模块类
4) Type:使用反射得到类型信息的最核心的类
他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.
使用 :
要动态加载一个程序集主要用Assembly的Load和LoadFrom的静态方法.
Assembly.Load("程序集名")
Assembly.LoadFrom("程序集实际路径")例子:
下边代码摘自:http://www.cnblogs.com/zhangpengshou/archive/2010/03/29/1699881.html
//程序集测试类test.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace testclass
{
public class Class1
{
public string GetName1()
{
return "Get the name!";
}
public string GetName2(string name)
{
return name;
}
}
}
//调用代码
class Program
{
static void Main(string[] args)
{
System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFile(@"C:\testclass.dll");
Type type;
object obj;
type = ass.GetType("testclass.Class1"); //必须使用名称空间+类名称
obj = ass.CreateInstance("testclass.Class1");//必须使用名称空间+类名称
System.Reflection.MethodInfo method = type.GetMethod("GetName1");//方法的名称
string s = (string)method.Invoke(obj, null); //实例方法的调
Console.WriteLine(s);
method = type.GetMethod("GetName2");
s = (string)method.Invoke(obj, new string[] { "你好!" });
Console.WriteLine(s);
}
}
在实际运用中,我们可以用下边方法直接创建类。
public static AbstractFactory GetInstance()
{
//从配置文件中取类名名称
string factoryName = ConfigurationSettings.AppSettings["factoryName"];
AbstractFactory instance;
if (factoryName != "")
{
//加载程序集,并创建类。CreateInstance的格式为CreateInstace(命名空间.类名)
instance = (AbstractFactory)Assembly.Load("AbstractFactoryPattern")
.CreateInstance("AbstractFactoryPattern."+factoryName );
}
else
{
return null;
}
//返加通过反射得到的类
return instance;
}
介绍:
反射使用System.Reflection命名空间。此命名空间中几个类的关系需要先明白。
1) AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器.
2) Assembly:程序集类
3) Module:模块类
4) Type:使用反射得到类型信息的最核心的类
他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.
使用 :
要动态加载一个程序集主要用Assembly的Load和LoadFrom的静态方法.
Assembly.Load("程序集名")
Assembly.LoadFrom("程序集实际路径")例子:
下边代码摘自:http://www.cnblogs.com/zhangpengshou/archive/2010/03/29/1699881.html
//程序集测试类test.cs
using System;
using System.Collections.Generic;
using System.Text;
namespace testclass
{
public class Class1
{
public string GetName1()
{
return "Get the name!";
}
public string GetName2(string name)
{
return name;
}
}
}
//调用代码
class Program
{
static void Main(string[] args)
{
System.Reflection.Assembly ass = System.Reflection.Assembly.LoadFile(@"C:\testclass.dll");
Type type;
object obj;
type = ass.GetType("testclass.Class1"); //必须使用名称空间+类名称
obj = ass.CreateInstance("testclass.Class1");//必须使用名称空间+类名称
System.Reflection.MethodInfo method = type.GetMethod("GetName1");//方法的名称
string s = (string)method.Invoke(obj, null); //实例方法的调
Console.WriteLine(s);
method = type.GetMethod("GetName2");
s = (string)method.Invoke(obj, new string[] { "你好!" });
Console.WriteLine(s);
}
}
在实际运用中,我们可以用下边方法直接创建类。
public static AbstractFactory GetInstance()
{
//从配置文件中取类名名称
string factoryName = ConfigurationSettings.AppSettings["factoryName"];
AbstractFactory instance;
if (factoryName != "")
{
//加载程序集,并创建类。CreateInstance的格式为CreateInstace(命名空间.类名)
instance = (AbstractFactory)Assembly.Load("AbstractFactoryPattern")
.CreateInstance("AbstractFactoryPattern."+factoryName );
}
else
{
return null;
}
//返加通过反射得到的类
return instance;
}
相关文章推荐
- 模式开发—运用配置文件和反射机制重构客户端代码
- 运用Mono.Cecil 反射读取.NET程序集元数据
- 运用反射机制捕获类的原型
- python之面向对象之反射运用
- Android中巧妙运用反射和注解,同时控制所有同类控件
- java进阶(三):反射(3)——数组的反射与集合的运用(ArrayList、HashSet)
- 重构:运用Java反射加多态 “干掉” switch
- Java反射的运用
- java反射--注解的定义与运用以及权限拦截
- Java反射及其在开发数据库上面的运用
- 运用Mono.Cecil 反射读取.NET程序集元数据
- 运用反射获取自定义注解信息
- 关于Java语言中如何运用反射机制执行某个确定类的构造方法(一)
- 运用类反射机制简化Struts应用程序的开发
- java.lang.reflec 运用及反射方法获取实例
- c#运用反射获取属性和设置属性值
- java反射--注解的定义与运用以及权限拦截
- 运用反射格式化SD卡
- JDBC之运用反射模拟ORM
- 反射(三):反射的基本运用