反射就是在运行的时候发现对象的相关信息。根据这些信息可以动态的执行对象的方法以及获取对象的属性所储存的值。

 

1,首先我们先建立一个类库工程MyDll,并新建一个类ReflectTest

代码如下:

 

 


深入剖析反射using System;
深入剖析反射
深入剖析反射
namespace
 MyDll
深入剖析反射深入剖析反射
深入剖析反射
{
深入剖析反射深入剖析反射    
/**//// <summary>
深入剖析反射    
/// ReflectTest 的摘要说明。
深入剖析反射    
/// </summary>

深入剖析反射
深入剖析反射    
//接口
深入剖析反射
    public interface ITest    
深入剖析反射深入剖析反射    
深入剖析反射
{
深入剖析反射        
int
 add();
深入剖析反射        
深入剖析反射    }

深入剖析反射
深入剖析反射    
public class ReflectTest : ITest            
深入剖析反射深入剖析反射    
深入剖析反射
{       
深入剖析反射        
public
 String Write;
深入剖析反射        
private
 String Writec;
深入剖析反射
深入剖析反射        
public int
 add()
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return 10
;
深入剖析反射        }

深入剖析反射
深入剖析反射        
public String Writea
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射深入剖析反射            
get 深入剖析反射return Write;}

深入剖析反射深入剖析反射            
set    深入剖析反射{ Write = value;}        
深入剖析反射        }

深入剖析反射
深入剖析反射        
private String Writeb
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射深入剖析反射            
get    深入剖析反射return Writec;}

深入剖析反射深入剖析反射            
set    深入剖析反射{ Writec = value;}
深入剖析反射        }

深入剖析反射
深入剖析反射        
//构造函数
深入剖析反射
        public ReflectTest()
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
this.Write = "Write"
;
深入剖析反射            
this.Writec = "Writec"
;
深入剖析反射        }

深入剖析反射
深入剖析反射        
//有参构造函数
深入剖析反射
        public ReflectTest(string str1,string str2)
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
this.Write =
 str1;
深入剖析反射            
this.Writec =
 str2;
深入剖析反射        }

深入剖析反射
深入剖析反射        
public string PrintString(string s)
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return "这是一个实例方法" +
 s;
深入剖析反射        }

深入剖析反射
深入剖析反射        
private string PrintString2()
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return "这是一个私有方法"
;
深入剖析反射        }

深入剖析反射
深入剖析反射        
public static string Print(string s)
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return "这是一个静态方法," +
 s;
深入剖析反射        }

深入剖析反射        
深入剖析反射        
public string PrintNoPara()
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return "您使用的是无参数方法"
;
深入剖析反射        }

深入剖析反射
深入剖析反射        
public static string PrintData(string s)
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return
 s;
深入剖析反射        }

深入剖析反射
深入剖析反射        
public static string PrintData(string s1, string s2)
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            
return s1+
s2;
深入剖析反射        }

深入剖析反射
深入剖析反射        
深入剖析反射
深入剖析反射    }

深入剖析反射}

深入剖析反射

 

 



编译后得到MyDll.dll文件

2,应用反射

 

 

深入剖析反射
深入剖析反射using System;
深入剖析反射
using
 System.Reflection;
深入剖析反射
深入剖析反射
namespace
 cmdText
深入剖析反射深入剖析反射
深入剖析反射
{
深入剖析反射深入剖析反射    
/**//// <summary>
深入剖析反射    
/// 说明:反射学习
深入剖析反射    
///
 程序:寻梦E.net
深入剖析反射    
/// </summary>

深入剖析反射    public class Reflect2
深入剖析反射深入剖析反射    
深入剖析反射
{
深入剖析反射
深入剖析反射        
delegate string TestDelegate(string
 value1);
深入剖析反射
深入剖析反射        
public static void Main(string
[] args)        
深入剖析反射深入剖析反射        
深入剖析反射
{
深入剖析反射            Assembly ass 
= null
 ;
深入剖析反射            Type type 
= null
 ;
深入剖析反射            
object obj = null
;
深入剖析反射
深入剖析反射            
string assemblyName = "MyDll"
;
深入剖析反射            
string className = "MyDll.ReflectTest"
;        
深入剖析反射            
深入剖析反射            
try

深入剖析反射深入剖析反射            
深入剖析反射{
深入剖析反射                
//
以下三种方法都可以
深入剖析反射                
//
ass = Assembly.LoadFile(System.Environment.CurrentDirectory+"/MyDll.dll");
深入剖析反射                
//ass = Assembly.LoadFrom(System.Environment.CurrentDirectory+"/MyDll.dll");

深入剖析反射
                ass = Assembly.Load(assemblyName);
深入剖析反射                
深入剖析反射            }

深入剖析反射            
catch
深入剖析反射深入剖析反射            
深入剖析反射{
深入剖析反射                Console.Write(
"无法找到程序集!"
);
深入剖析反射                
return
;
深入剖析反射                
深入剖析反射            }
        
深入剖析反射            
//获取类型

深入剖析反射
            type = ass.GetType(className);
深入剖析反射            
//type = Type.GetType(className);//
效果同上
深入剖析反射            
//生成一个类实例,无参构造函数

深入剖析反射
            obj = ass.CreateInstance(className);
深入剖析反射            
//obj = Activator.CreateInstance(type);//
效果同上
深入剖析反射        
深入剖析反射
深入剖析反射            
//
**************************方法调用*************************************
深入剖析反射            
//反射实例方法

深入剖析反射

深入剖析反射            Console.WriteLine(
"*******方法调用**************************************");
深入剖析反射            MethodInfo method 
= type.GetMethod("PrintString"
);
深入剖析反射深入剖析反射            
string s = (string)method.Invoke(obj,new string[]深入剖析反射{"寻梦E.net"}
);
深入剖析反射            Console.WriteLine(s);
深入剖析反射
深入剖析反射            
//反射私有方法

深入剖析反射
            method = type.GetMethod("PrintString2",BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
深入剖析反射            s 
= (string)method.Invoke(obj,null
);
深入剖析反射            Console.WriteLine(s);
深入剖析反射
深入剖析反射            
//反射静态方法

深入剖析反射
            method = type.GetMethod("Print");
深入剖析反射深入剖析反射            s 
= (string)method.Invoke(null,new string[]深入剖析反射{"寻梦E.net"}
);
深入剖析反射            Console.WriteLine(s);
深入剖析反射
深入剖析反射            
//反射无参方法

深入剖析反射
            method = type.GetMethod("PrintNoPara");
深入剖析反射            s 
= (string)method.Invoke(obj,null
);
深入剖析反射            Console.WriteLine(s);
深入剖析反射
深入剖析反射            
//反射重载了的静态方法

深入剖析反射深入剖析反射
            Type[] objParam = 深入剖析反射{typeof(string),typeof(string)};
深入剖析反射            method 
= type.GetMethod("PrintData"
,objParam );
深入剖析反射深入剖析反射            s 
= (string)method.Invoke(null,new object[]深入剖析反射{"hello!"," 寻梦E.net"}
);
深入剖析反射            Console.WriteLine(s);
深入剖析反射
深入剖析反射            Console.WriteLine(
"*******属性,域的赋值与访问***********************"
);
深入剖析反射
深入剖析反射
深入剖析反射            
//
*****************属性,域的赋值与访问***************************************
深入剖析反射            
//公有属性

深入剖析反射
            PropertyInfo pi1 = type.GetProperty("Writea");
深入剖析反射            pi1.SetValue(obj, 
"公有属性:Writea"null
);
深入剖析反射            Console.WriteLine(pi1.GetValue(obj,
null
));
深入剖析反射
深入剖析反射            
//私有属性

深入剖析反射
            PropertyInfo pi2 = type.GetProperty("Writeb", BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public);
深入剖析反射            pi2.SetValue(obj, 
"私有属性:Writeb"null
);
深入剖析反射            Console.WriteLine(pi2.GetValue(obj, 
null
));
深入剖析反射            
深入剖析反射            
//

深入剖析反射
            FieldInfo fi1 = type.GetField("Write");
深入剖析反射            Console.WriteLine(fi1.GetValue(obj));
深入剖析反射
深入剖析反射
深入剖析反射            Console.WriteLine(
"*******类型,模块,方法,构造函数等信息的获取*****"
);
深入剖析反射
深入剖析反射            
深入剖析反射
深入剖析反射
深入剖析反射            
//
******************类型,模块,方法,构造函数等信息的获取******************************************
深入剖析反射            
深入剖析反射            
//
有参构造函数实例化
深入剖析反射            
//
string[] classParams = {"lsm","sky"};
深入剖析反射            
//object obj2 = Activator.CreateInstance(type,classParams);

深入剖析反射

深入剖析反射            
foreach(Type t in ass.GetTypes())
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"类型:"+
t.Name );
深入剖析反射            }

深入剖析反射            
深入剖析反射            
foreach(Module m in ass.GetModules())
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"模块:"+
m.Name);
深入剖析反射            }

深入剖析反射
深入剖析反射            MethodInfo[] methods 
= type.GetMethods();
深入剖析反射            
foreach (MethodInfo m in
 methods)
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"方法"+m.Name);  //显示所有的共有方法

深入剖析反射
            }

深入剖析反射
深入剖析反射            FieldInfo[] fields 
= type.GetFields();
深入剖析反射            
foreach (FieldInfo f in
 fields)
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"字段信息:"+
f.Name);
深入剖析反射            }

深入剖析反射
深入剖析反射            PropertyInfo[] propertys 
= type.GetProperties();
深入剖析反射            
foreach( PropertyInfo p in
 propertys)
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"属性:"+
p.Name);
深入剖析反射            }

深入剖析反射
深入剖析反射            ConstructorInfo[] ci1 
= type.GetConstructors();
深入剖析反射            
foreach (ConstructorInfo ci in
 ci1)
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"构造函数:"+ci.ToString()); //获得构造函数的形式

深入剖析反射
                
深入剖析反射            }

深入剖析反射
深入剖析反射            
//*******************接口***************************************
深入剖析反射
            
深入剖析反射            Console.WriteLine(
"*******接口*****************************************"
);
深入剖析反射
深入剖析反射            MyDll.ITest obj1 
= (MyDll.ITest)ass.CreateInstance(className);//
这里必须是实现接口的类名,因为接口不能实例化
深入剖析反射            
//
MyDll.ReflectTest obj2= (MyDll.ReflectTest)ass.CreateInstance(className);
深入剖析反射            
//典型的工厂模式

深入剖析反射
            int i = obj1.add();
深入剖析反射            Console.WriteLine(i);
深入剖析反射
深入剖析反射
深入剖析反射            
//*****************委托*******************************************

深入剖析反射

深入剖析反射            TestDelegate myDelegate 
= (TestDelegate)Delegate.CreateDelegate(typeof(TestDelegate), obj, "PrintString");
深入剖析反射            
//动态创建委托的简单例子

深入剖析反射
            Console.WriteLine(myDelegate(" 动态调用委托"));
深入剖析反射
深入剖析反射
深入剖析反射            
//*****************获得解决方案的所有Assembly********************

深入剖析反射

深入剖析反射            Assembly[] assemblys 
= AppDomain.CurrentDomain.GetAssemblies();
深入剖析反射            
//遍历显示每个Assembly的名字

深入剖析反射
            foreach (object var in assemblys)
深入剖析反射深入剖析反射            
深入剖析反射
{
深入剖析反射                Console.WriteLine(
"所有的Assembly的名字:"+
var.ToString());                
深入剖析反射            }

深入剖析反射            
深入剖析反射            
深入剖析反射            Console.Read();
深入剖析反射
深入剖析反射
深入剖析反射
深入剖析反射        }

深入剖析反射
深入剖析反射
深入剖析反射    }

深入剖析反射}

运行效果图如下:
深入剖析反射

 

转载于:https://www.cnblogs.com/qiantuwuliang/archive/2009/05/30/1492445.html

相关文章: