码迷,mamicode.com
首页 > Windows程序 > 详细

C# - 反射

时间:2017-09-24 18:15:55      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:static   code   ctypes   安全性   存储   get   cti   font   style   

反射(Reflection)

反射是一种机制,由.net framework类库提供的一种能显示出某个程序集中的元数据的机制。要利用反射,首先需要获得Type实例,Type类表示任意类型的相关信息,它提供一系列属性和方法用于获取某个类型的元数据,可以获取某个类的成员信息并设置或修改属性成员、调用成员方法,如果设置了恰当的代码访问安全性(Code Access Security)权限,反射还可以绕过可访问性规则,比如访问private、protected的成员

 

获取Type对象

有两种方式可以获取类型的Type表示,任意类型的对象调用GetType()方法或使用typeof运算符
Animal a = new Animal ( );
Type typeForAnimal1=a.GetType ( );
Type typeForAnimal2 = typeof ( Animal );
bool Test = typeForAnimal1 == typeForAnimal2;

 

Assembly类(System.Reflection.Assembly)

表示对程序集的描述,使用它可以很方便的将某个程序集载入到当前应用程序域中从而获取该程序集的信息

//属性
CodeBase
//返回一个字符串表示原先所指定的程序集的实际位置

EntryPoint
//返回一个MethodInfo实例表示当前加载的程序集的入口

Evidence
//返回一个Evidence实例,该实例包含了签名和代码初始位置的信息

FullName
//返回一个字符串表示当前加载的程序集的名称、版本号、文化标识

GlobalAssemblyCache
//返回一个bool值表示当前加载的程序集是否是从全局程序集缓存中加载进来的(全局程序集缓存是用来存储被多个应用程序所共享的程序集)

Location
//返回一个字符串表示当前加载的程序集的路径
//静态方法
CreateQualifiedName ( )
//创建该类型所在的程序集的显示名称所限定的类型的名称
//假设Tree定义在Forest程序集中,则该方法返回Tree.Forest

GetAssembly
//返回一个Acssemly实例,该实例是根据参数提供的类型生成的对象

 

Type类(System.Reflection.Type

获取任意类型的Type表示。

//以下的GetMethod、GetMethods、GetProperty、GetProperties方法具有BindingFlags的参数,用以指定需要搜索的成员
//BindingFlags枚举可能的值如下
//1.Public : 只获取公共的成员
//2.NoPublic : 只获取非公共的成员
//3.Instance : 只获取对象的成员
//4.Static : 获取类的成员
//5.DeclaredOnly : 不获取继承的成员
//BindingFlags枚举必须用项1或项2组合其它项,否则只会获取到null
GetMethods ( )
//返回一个MethodInfo数组,存储被搜索到的方法的信息
//示例:
//只获取类的公共的实例方法,不包括继承
Type t = typeof ( Animal );
MethodInfo [ ] methods = t.GetMethods ( BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly );

GetProperties ( )
//返回一个PropertyInfo数组,存储被搜索到的属性的信息

GetMethod ( string methodName )
//获取该类型的单个方法的信息,返回一个MethodInfo对象

GetProperty ( string propertyName )
//获取该类型的单个属性的信息,返回一个PropertyInfo对象 

IsGenericType
//判断当前Type对象是否是泛型或泛型方法
//示例:
Type type = typeof ( Animal<string> );
Console.Write ( type.IsGenericType );//print true

ContainsGenericParameters
//判断某个类型或某个方法的类型参数是否还未具有实参
//示例:
Type type = typeof ( Animal<> );
Console.Write ( type.ContainsGenericParameters );//print true
Type type = typeof ( Animal<string> );
Console.Write ( type.ContainsGenericParameters );//print false

GetGenericArguments()
//获取泛型、泛型方法的类型参数
//示例:
Animal<string> a = new Animal<string> { };
Type type = typeof ( Animal<string> );
Type [ ] AnimalGenericTypes = type.GetGenericArguments ();
foreach(Type AnimalGenericType in AnimalGenericTypes )
{
    Console.WriteLine ( AnimalGenericType.GetProperties() );
}

 

MethodInfo类(System.Reflection.MethodInfo

表示方法的信息

Name
//方法名称

ReturnType.Name
//获取方法的返回类型的名称

Invoke ( )
//执行该方法

GetParameters ( )
//获取方法的形参信息,返回一个ParameterInfo数组存储所有形参信息
//示例:
//读取某个类的所有方法
Type x = typeof ( MyClass );
MethodInfo [ ] methods = x.GetMethods ( );
StringBuilder s = new StringBuilder ( );
foreach ( var method in methods )
{
    s.AppendFormat ( "<div style=‘margin-top:100px;‘><div>函数名称:{0}</div>" , method.Name );
    s.AppendFormat ( "<div>函数返回类型:{0}</div>" , method.ReturnType.Name );
    foreach ( var @params in method.GetParameters ( ) )
    {
        s.AppendFormat ( "<div style=‘margin-left:100px;‘>函数形参名称:{0}</div>" , @params.Name );
        s.AppendFormat ( "<div style=‘margin-left:100px;‘>函数形参类型:{0}</div>" , @params.ParameterType.Name );
    }
    s.Append ( "</div>" );
}
Console.WriteLine ( s.ToString ( ) );

 

ParameterInfo类(System.Reflection.ParameterInfo

表示方法的参数信息。

Name
//形参名称

ParameterType.Name
//形参类型的名称

 

PropertyInfo类(System.Reflection.PropertyInfo

表示属性的信息。

PropertyType
//获取属性的类型
//示例:
PropertyInfo property = typeof ( Animal ).GetProperties ( ) [ 0 ];
bool IsBool=property.PropertyType == typeof ( bool ); //简单类型判断这样写
bool IsClass = property.PropertyType.IsClass; //复杂类型判断这样写

GetValue ( obj )
//获取指定对象的属性值

SetValue ( obj )
//设置指定对象的属性值
//示例:
Type type = typeof ( Animal );
PropertyInfo property = type.GetProperty ( "Name" );
Animal t = new Animal ( );
string name = property.GetValue ( t ).ToString ( );
Console.WriteLine ( name );

 

C# - 学习总目录

 

C# - 反射

标签:static   code   ctypes   安全性   存储   get   cti   font   style   

原文地址:http://www.cnblogs.com/myrocknroll/p/7285865.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!