C#

反射(Reflection)

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

//方式一
Animal a = new Animal();
a.Name = "sam";
Type animalType = a.GetType();
var property = animalType.GetProperty("Name");
Console.WriteLine(property.GetValue(a));

//方式二
Type animalType = typeof(Animal);
var property= animalType.GetProperty("Name");
//获取成员必须传递类型的实例,在实例上调用成员
//Activator.CreateInstance方法根据参数对象调用其类型的构造函数创建对象实例
Animal a = (Animal)Activator.CreateInstance(animalType); 
Console.WriteLine(property.GetValue(a));

简单的例子

//获得Animal的Type表示
Type animalype = typeof(Animal);
//创建Annimal实例
object animal = Activator.CreateInstance(animalype, new object[] { "sam", "18" });
            
//获取Animal的属性
var propertName= animalype.GetProperty("Name");
var propertyAge = animalype.GetProperty("Age");
//读取属性值,需要在Animal实例上调用
Console.WriteLine(propertName.GetValue(animal));
Console.WriteLine(propertyAge.GetValue(animal));

//获取Animal的方法
var methodInfo = animalype.GetMethod("GetStr");
//调用方法,需要在Animal实例上调用
var result = methodInfo.Invoke(animal, null);
//输出调用方法的结果上
Console.WriteLine(result);

Assembly类(System.Reflection.Assembly)

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

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

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

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

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

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

Location
//返回一个字符串表示当前加载的程序集的路径
//静态方法
LoadFrom ( string assemblyName)
//加载
//示例1:
 Assembly asm = Assembly.LoadFrom("Model.dll"); //加载当前项目已经引用的程序集,注意:只有已经引用到当前项目的程序集才能被加载
//示例2:
Assembly asm = Assembly.LoadFrom ( AppDomain.CurrentDomain.BaseDirectory + "\Model.dll" ); //加载在同一个应用程序域中的任何程序集,需给出全路径

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 , BindingFlags flags | Type [ ] types );
//获取该类型的单个方法的信息,返回一个MethodInfo对象
//types用于指定方法的参数类型
//示例:
typeof (Animal ).GetMethod ( "Show" , new Type [ ] { typeof (string ),typeof(string) } );

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() );
}

GetCustomAttribute ( Type AttributeType , [bool getInstance]  )
//获取应用在当前类型上的自定义特性
//参数2是一个可选的bool值,表示一个是否查找当前类在继承链上的特性的开关,比如当前类的父类也引用了某个特性,开关如果为true则会同时查找运用到父类上的特性
//示例:假设在Philosopher上运用了一个自定义的Analysis特性
Type type = typeof ( Philosopher ); //获取Philosopher的Type表示
Attribute attri = type.GetCustomAttribute ( typeof ( Analysis ) ); //在Philosopher的Type表示上获取Analysis特性
Analysis analysis = attri as Analysis;
Console.WriteLine(analysis.Description ); //读取特性的信息,Description是定义在Analysis特性中的属性

IsAssignableFrom ( Type t )
//当前Type实例是否可以分配给参数指定的Type实例
//示例:

typeof(IAnimal).IsAssignableFrom ( animal )

 

MethodInfo类(System.Reflection.MethodInfo

表示方法的信息

//属性和方法
Name
//方法名称

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

Invoke (object o,params paramters[] )
//执行此方法,o指定此方法运行在哪个实例上,paramters指定参数列表,如果方法无参数,提供null即可。

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 );

MemberInfo类

提供对类、对象成员元数据的访问

 

 

C# - 学习总目录

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