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

推荐订阅源

Google DeepMind News
Google DeepMind News
Stack Overflow Blog
Stack Overflow Blog
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
T
The Blog of Author Tim Ferriss
博客园 - 叶小钗
N
Netflix TechBlog - Medium
腾讯CDC
C
Check Point Blog
P
Proofpoint News Feed
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
S
SegmentFault 最新的问题
F
Fortinet All Blogs
美团技术团队
U
Unit 42
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 司徒正美
F
Full Disclosure
Recorded Future
Recorded Future
D
DataBreaches.Net
博客园 - 【当耐特】
Martin Fowler
Martin Fowler
J
Java Code Geeks
I
InfoQ
Y
Y Combinator Blog
A
About on SuperTechFans
AI
AI
爱范儿
爱范儿
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Forbes - Security
Forbes - Security
W
WeLiveSecurity
M
MIT News - Artificial intelligence
雷峰网
雷峰网
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Simon Willison's Weblog
Simon Willison's Weblog
Schneier on Security
Schneier on Security
The GitHub Blog
The GitHub Blog
Security Archives - TechRepublic
Security Archives - TechRepublic
aimingoo的专栏
aimingoo的专栏
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
G
GRAHAM CLULEY
Know Your Adversary
Know Your Adversary
Latest news
Latest news
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
D
Docker
Recent Commits to openclaw:main
Recent Commits to openclaw:main
量子位
V2EX - 技术
V2EX - 技术
Project Zero
Project Zero

博客园 - 文野

DDD自问自答 数据结构(C#语言版)——栈和队列 数据结构(C#语言版)——线性表 2011一月的三个故事 我想要的2011 我的2011的三个故事 《悟透JavaScript》中的知识点 用Windows Live Writer写博客 我们是不是把MVC、ORM等技术的主次颠倒了? 论单一职责 对象结构 由做梦想到的 2009第一帖,测试用Word2007发布博客 一点一点学ASP.NET之基础概念——事件 应用框架的设计与实现学习手札系列(持续更新) 未解决的问题(持续更新) 一点一点学ASP.NET之基础概念——委托 一点一点学ASP.NET之示例——HttpModule 示例 一点一点学ASP.NET系列(持续更新)
应用框架的设计与实现学习手札之类工厂服务——反射
文野 · 2006-08-14 · via 博客园 - 文野

反射

—— 应用框架的设计与实现学习手札

文野:2006814星期一

概述

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

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

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创建一个实例

        
动态调用构造函数

        
反射方法

        
反射参数

        
反射属性

        
反射字段
    }

}


 

总结:

我们看到,简单的反射使用还是挺简单的,一般只要指定搜索的名称与搜索的类型就可以了。而且我觉得现实中使用反射大部分是都是通过动态创建一个接口的实现类的实例,然后调用接口中定义的方法,还是很少象上面那样通过Type调用类内的各个成员。

参考资料:

《Visual Basic .NET Power Coding》 

本文源码:

下载