惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

V
V2EX
C
Check Point Blog
博客园_首页
B
Blog
D
Docker
U
Unit 42
量子位
I
InfoQ
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler
GbyAI
GbyAI
L
LangChain Blog
云风的 BLOG
云风的 BLOG
博客园 - Franky
美团技术团队
T
The Blog of Author Tim Ferriss
阮一峰的网络日志
阮一峰的网络日志
月光博客
月光博客
Vercel News
Vercel News
Recent Announcements
Recent Announcements
雷峰网
雷峰网
大猫的无限游戏
大猫的无限游戏
小众软件
小众软件
Google DeepMind News
Google DeepMind News

博客园 - 谭洪星

NHibernate教程(转载) MVC模式在.NET框架中的应用与实现 混乱的MVC,.NET非要MVC不可么?(转) ASP.NET实现URL映射 PetShop的系统架构设计(转) ASP.NET中常用的优化性能方法 设计模式学习笔记(三)——Abstract Factory抽象工厂模式 (转) 观察者模式及实现(转) 悟透JavaScript (转) 深入研究Asp.net页面的生命周期 [你必须知道的.NET] 第一回:恩怨情仇:is和as Net中的反射使用入门 .Net 中的反射(反射特性) - Part.3 软件工程心理学之---让客户知错,但不能向你发怒 用AJAX.NET的客户端脚本实现UpdateProgress的效果 - 谭洪星 - 博客园 C#(也适用其他)的初学者对string是值类型还是引用类型搞不清楚,还有对参数传递也比较迷糊 C#泛型之详解 [你必须知道的.NET]第十二回:参数之惑---传递的艺术(下) [你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)
.net反射简介
谭洪星 · 2008-05-29 · via 博客园 - 谭洪星

概述

反射就是动态发现类型信息的能力。它帮助程序设计人员在程序运行时利用一些信息去动态地使用类型,这些信息在设计时是未知的,这种能力类型于后期绑定。反射还支持的更高级的行为,能在运行时动态创建新类型,并且对这些新类型的操作进行调用。

一些在反射中经常使用的类

Assembly

Assembly类是可重用、无版本冲突并且可自我描述的公共语言运行库应用程序构造块。可以使用Assembly.LoadAssembly.LoadFrom方法动态地加载程序集。

Type

反射的中心是System.Type类。System.Type类是一个抽象类,代表公用类型系统中的一种类型。这个类使您能够查询类型名、类型中包含的模块和名称空间、以及该类型是一个数值类型还是一个引用类型。

System.Type类使您能够查询几乎所有与类型相关的属性,包括类型访问限定符、类型是否、类型的COM属性等等。

Activator

Activator类支持动态创建.NET程序集和COM对象。可以通过CreateComInstanceFromCreateInstanceCreateInstanceFromGetObject四个静态方法加载COM对象或者程序集,并能创建指定类型的实例。

Binder

Binder类是一个用于执行类型转换的绑定器,Type对象的InvokeMember方法接受Binder对象,这个对象描述了如何将传递给InvokeMember的参数转换成方法实际需要的类型。

Binder类是一个抽象类,要创建绑定器,需要重写方法BindToMethodBindToFieldSelectMehtodSelectPropertyChangeType

DefaultMemberAttribute

    DefaultMemberAttribute类用于类型并带有一个指明默认成员名称的字符串参数。能够通过InvokeMember调用默认成员,而不需要传递调用成员的名称。当需要绑定器但不需要特别的绑定行为时就可以使用它。

其它

还有一些对元素类型信息描述的类,ConstrutorInfo(构造函数)、MethodInfo(方法)、FieldInfo(字段)、PropertyInfo(属性)、EventInfo(事件)、MemberInfo(成员)、ParameterInfo(参数)。如果查询得到了具有任何类型信息的实例,就可以获得该类型中任意元素的类型信息,当然出于安全原因,不保证会得到程序集中的任何信息。
 

示例

类定义:

using System;
using System.Collections.Generic;
using System.Text;

namespace ReflectionSample
{
    
/**//// <summary>
    
/// 说明:一个简单的类
    
/// 作者:文野
    
/// 联系:stwyhm.cnblog.com
    
/// </summary>

    public class ClassSample
    
{
        
// 默认构造
        public ClassSample()
        
{
            
this.name = "您调用了默认构造创建了一个类实例。";
        }


        
// 带参构造
        public ClassSample(string name)
        
{
            
this.name = name;
        }


        
// 字段 
        public string name;

        
public string Field;

        
// 属性
        private string property;
        
public string Property
        
{
            
set this.property = value; }
            
get return property; }
        }


        
// public方法 
        public string PublicClassMethod()
        
{
            
return string.Format("您反射了一个Public方法");
        }


        
// private方法
        private string PrivateClassMethod()
        
{
            
return string.Format("您反射了一个Private方法");
        }


        
// static方法
        public static string StaticMethod()
        
{
            
return "您反射了一个Static方法";
        }


        
// 帶參方法
        public string ParameterMethod(string para)
        
{
            
return para;
        }


        
public event EventHandler eventHandler;

        
public void DoEvent()
        
{
            eventHandler(
null,EventArgs.Empty);
        }

    }

}

反射示例

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

using System.Reflection;
using ReflectionSample;

/**//// <summary>
/// 说明:一个简单的使用反射示例
/// 作者:文野
/// 联系:stwyhm.cnblog.com
/// </summary>

public partial class _Default : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    
{
        
string path = Server.MapPath(Request.Path);
        
string filePath = path.Substring(0, path.LastIndexOf('\\')) + @"\bin\ReflectionSample.dll";
        
// 获取程序集
        Assembly classSampleAssembly = Assembly.LoadFrom(filePath);

        
// 从程序集中获取指定对象类型
        Type classSampleType = classSampleAssembly.GetType("ReflectionSample.ClassSample");

        使用Activator创建一个实例
#region 使用Activator创建一个实例

        
// 通过对象类型创建对象实例
        ClassSample s1 = Activator.CreateInstance(classSampleType) as ClassSample;

        Response.Write(s1.name 
+ "(使用Activator创建一个实例)<br />");

        
#endregion


        动态调用构造函数
#region 动态调用构造函数

        
// 调用无参构造
        ConstructorInfo studentConstructor1 = classSampleType.GetConstructor(new Type[] { });
        ClassSample s2 
= studentConstructor1.Invoke(new object[] { }as ClassSample;
        Response.Write(s2.name 
+ "<br />");

        
// 调用有参构造
        ConstructorInfo studentConstructor2 = classSampleType.GetConstructor(new Type[] typeof(string) });
        ClassSample s3 
= studentConstructor2.Invoke(new object[] "您调用了有参构造创建了一个类实例。" }as ClassSample;
        Response.Write(s3.name 
+ "<br />");

        
#endregion


        反射方法
#region 反射方法

        
// 调用非静态方法
        string returnValue1 = classSampleType.InvokeMember("PublicClassMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }as string;
        Response.Write(returnValue1 
+ "<br />");

        
// 调用静态方法
        string returnValue2 = classSampleType.InvokeMember("StaticMethod", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Static, null, s1, new object[] { }as string;
        Response.Write(returnValue2 
+ "<br />");

        
// 调用私有方法
        string returnValue3 = classSampleType.InvokeMember("PrivateClassMethod", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, s1, new object[] { }as string;
        Response.Write(returnValue3 
+ "<br />");

        
#endregion


        反射参数
#region 反射参数

        MethodInfo parameterMethod 
= classSampleType.GetMethod("ParameterMethod");
        ParameterInfo[] paras 
= parameterMethod.GetParameters();
        
for (int i = 0; i < paras.Length; i++)
            Response.Write(
string.Format("您反射了一个带参方法。参数名:{0},参数类型:{1},是不是可选参数:{2},参数位置:{3},默认值:{4}<br/>"new object[] { paras[i].Name, paras[i].ParameterType.ToString(), paras[i].IsOptional.ToString(), paras[i].Position.ToString(), paras[i].DefaultValue.ToString() }));

        
#endregion


        反射属性
#region 反射属性

        classSampleType.InvokeMember(
"Property", BindingFlags.SetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] "您反射了一个属性" });
        
string returnValue4 = classSampleType.InvokeMember("Property", BindingFlags.GetProperty | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }as string;
        Response.Write(returnValue4 
+ "<br />");

        
#endregion


        反射字段
#region 反射字段

        classSampleType.InvokeMember(
"Field", BindingFlags.SetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] "您反射了一个字段" });
        
string returnValue5 = classSampleType.InvokeMember("Field", BindingFlags.GetField | BindingFlags.Public | BindingFlags.Instance, null, s1, new object[] { }as string;
        Response.Write(returnValue5 
+ "<br />");

        
#endregion

    }

}