.反射机制基础类
2014-02-24 20:12
405 查看
1.反射机制基础类
(1)反射机制的功能与介绍
审查元数据并收集关于它的类型信息的能力称为反射。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的几个类,允许用户解析这些元数据表的代码:
System.Reflection.Assembly:表示一个程序集。
System.Reflection.Module:在模块上执行反射。
System.Type:表示各种类型。
System.Reflection.MethodBase:提供有关方法和构造函数的信息。
System.Reflection.MethodInfo:发现方法的属性并提供对方法元数据的访问。
System.Reflection.MemberInfo:获取或访问有关成员属性。
System.Reflection.FieldInfo:发现字段属性并提供对字段元数据的访问权。
System.Reflection.PropertyInfo:发现或访问属性(Property)的属性(Attribute)。
System.Reflection.EventInfo:发现事件的属性并提供对事件元数据的访问权。
System.Reflection.ConstructorInfo:发现或访问类构造函数的属性。
(2)反射层次模型图
图像 1
(3)Assembly类获取程序及信息
class Program
{
static void Main(string[] args)
{
Assembly assem = Assembly.Load("mscorlib");//加载系统程序集
PrintInfo(assem);//输出程序集相关信息
assem = Assembly.LoadFrom(@"F:\System.Data.SQLite.dll");//或使用LoadFile()方法
PrintInfo(assem);//输出程序集相关信息
assem = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集
PrintInfo(assem);//输出程序集相关信息
Console.Read();
}
//输出程序集相关信息
static void PrintInfo(Assembly assem)
{
Console.WriteLine("程序集全名:" + assem.FullName);
Console.WriteLine("程序集的版本:" + assem.GetName()。Version);
Console.WriteLine("程序集初始位置:" + assem.CodeBase);
Console.WriteLine("程序集位置:" + assem.Location);
Console.WriteLine("程序集入口:" + assem.EntryPoint);
Type[] types = assem.GetTypes();//得到该程序集里所有的类型
Console.WriteLine("程序集下包含的类型数:" + types.Length);
//foreach (var item in types)
//{
// Console.WriteLine("类:" + item.Name);//输出类型名
//}
Console.WriteLine("============================\n");
}
}
(4)Module类获取程序集模块信息
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.Load("mscorlib");//加载程序集
Module module = assembly.GetModule("CommonLanguageRuntimeLibrary");//得到指定模块
Console.WriteLine("模块名:"+module.Name);
Type[] types = module.FindTypes(Module.FilterTypeName, "Assembly*");
foreach (var item in types)
{
Console.WriteLine("类名:" + item.Name);//输出类型名
}
Console.Read();
}
}
(5)Type类获取类型的信息
class Myclass
{
private int Id;
public string Name;
public void Method(int i) { }
}
class Program
{
static void Main(string[] args)
{
Type type = typeof(Myclass);
Console.WriteLine("类型名:" + type.Name);
Console.WriteLine("类全名:" + type.FullName);
Console.WriteLine("命名空间名:" + type.Namespace);
Console.WriteLine("程序集名:" + type.Assembly);
Console.WriteLine("模块名:" + type.Module);
Console.WriteLine("基类名:" + type.BaseType);
Console.WriteLine("是否类:" + type.IsClass);
Console.WriteLine("类的公共成员:");
MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员
foreach (var item in memberInfos)
{
Console.WriteLine("成员类型:" + item.MemberType + "\t成员:" + item);
}
Console.Read();
}
}
(6)利用反射调用方法
class Myclass
{
public Myclass()
{
Console.WriteLine("创建Myclass对象!");
}
public void Method(int i)
{
Console.WriteLine("输出值:" + i);
}
}
class Program
{
static void Main(string[] args)
{
Type t = typeof(Myclass);//得到类型
object o = Activator.CreateInstance(t);//创建类型的实例
Console.WriteLine("已创建Myclass对象:" + o);
MethodInfo method = t.GetMethod("Method");//获得实例的方法
method.Invoke(o, new object[] { 100 });//调用方法
Console.Read();
}
}
(1)反射机制的功能与介绍
审查元数据并收集关于它的类型信息的能力称为反射。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。System.reflection命名空间包含的几个类,允许用户解析这些元数据表的代码:
System.Reflection.Assembly:表示一个程序集。
System.Reflection.Module:在模块上执行反射。
System.Type:表示各种类型。
System.Reflection.MethodBase:提供有关方法和构造函数的信息。
System.Reflection.MethodInfo:发现方法的属性并提供对方法元数据的访问。
System.Reflection.MemberInfo:获取或访问有关成员属性。
System.Reflection.FieldInfo:发现字段属性并提供对字段元数据的访问权。
System.Reflection.PropertyInfo:发现或访问属性(Property)的属性(Attribute)。
System.Reflection.EventInfo:发现事件的属性并提供对事件元数据的访问权。
System.Reflection.ConstructorInfo:发现或访问类构造函数的属性。
(2)反射层次模型图
图像 1
(3)Assembly类获取程序及信息
class Program
{
static void Main(string[] args)
{
Assembly assem = Assembly.Load("mscorlib");//加载系统程序集
PrintInfo(assem);//输出程序集相关信息
assem = Assembly.LoadFrom(@"F:\System.Data.SQLite.dll");//或使用LoadFile()方法
PrintInfo(assem);//输出程序集相关信息
assem = Assembly.GetExecutingAssembly();//获取当前执行代码的程序集
PrintInfo(assem);//输出程序集相关信息
Console.Read();
}
//输出程序集相关信息
static void PrintInfo(Assembly assem)
{
Console.WriteLine("程序集全名:" + assem.FullName);
Console.WriteLine("程序集的版本:" + assem.GetName()。Version);
Console.WriteLine("程序集初始位置:" + assem.CodeBase);
Console.WriteLine("程序集位置:" + assem.Location);
Console.WriteLine("程序集入口:" + assem.EntryPoint);
Type[] types = assem.GetTypes();//得到该程序集里所有的类型
Console.WriteLine("程序集下包含的类型数:" + types.Length);
//foreach (var item in types)
//{
// Console.WriteLine("类:" + item.Name);//输出类型名
//}
Console.WriteLine("============================\n");
}
}
(4)Module类获取程序集模块信息
class Program
{
static void Main(string[] args)
{
Assembly assembly = Assembly.Load("mscorlib");//加载程序集
Module module = assembly.GetModule("CommonLanguageRuntimeLibrary");//得到指定模块
Console.WriteLine("模块名:"+module.Name);
Type[] types = module.FindTypes(Module.FilterTypeName, "Assembly*");
foreach (var item in types)
{
Console.WriteLine("类名:" + item.Name);//输出类型名
}
Console.Read();
}
}
(5)Type类获取类型的信息
class Myclass
{
private int Id;
public string Name;
public void Method(int i) { }
}
class Program
{
static void Main(string[] args)
{
Type type = typeof(Myclass);
Console.WriteLine("类型名:" + type.Name);
Console.WriteLine("类全名:" + type.FullName);
Console.WriteLine("命名空间名:" + type.Namespace);
Console.WriteLine("程序集名:" + type.Assembly);
Console.WriteLine("模块名:" + type.Module);
Console.WriteLine("基类名:" + type.BaseType);
Console.WriteLine("是否类:" + type.IsClass);
Console.WriteLine("类的公共成员:");
MemberInfo[] memberInfos = type.GetMembers();//得到所有公共成员
foreach (var item in memberInfos)
{
Console.WriteLine("成员类型:" + item.MemberType + "\t成员:" + item);
}
Console.Read();
}
}
(6)利用反射调用方法
class Myclass
{
public Myclass()
{
Console.WriteLine("创建Myclass对象!");
}
public void Method(int i)
{
Console.WriteLine("输出值:" + i);
}
}
class Program
{
static void Main(string[] args)
{
Type t = typeof(Myclass);//得到类型
object o = Activator.CreateInstance(t);//创建类型的实例
Console.WriteLine("已创建Myclass对象:" + o);
MethodInfo method = t.GetMethod("Method");//获得实例的方法
method.Invoke(o, new object[] { 100 });//调用方法
Console.Read();
}
}
相关文章推荐
- JSR 168 翻译01(What is a Portal& portlet?)
- 将数字(类似金钱)显示在控件中,你可以输入输出并且可以将数字转换成文字
- symantec最新招聘信息
- (二)初步了解
- DataGrid相关知识总结(转的)
- 我对于关键字Ref和Out的理解
- 我们的Android学习轨迹
- Framework Fundamentals 基本结构
- Framework Fundamentals 基本结构
- can reflect poorly on the business. When choosing the right equipment
- PCA--主成分分析
- 在.net窗体程序中使用用户控件
- PERL Catalyst 安装使用
- 如何配置才能使用InterDev 来调试ASP代码 zt
- 读取其他应用的manifest文件
- What do I Need to Get Started?
- Intermidiate EDI--ebXML
- An Introduction to Struts
- 有向图强连通分量Tarjan
- 【分享】Windows XP SP2 Build 2177 Nfo