`
isiqi
  • 浏览: 16364441 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

(Reflection)认识反射(反射实例化,反射评价,在工厂三层架构应用)

阅读更多

反射的基础概念:

反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件,以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

  NET可执行应用程序结构

  程序代码在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。

  应用程序结构分为应用程序域—程序集—模块—类型—成员几个层次,公共语言运行库加载器管理应用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序集中类型层次结构的内存布局。

  程序集包含模块,而模块包含类型,类型又包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途。

  (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。

  (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其它特定的非全局方法。

  (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic private)和实现详细信息(如abstractvirtual)等。使用TypeGetConstructorsGetConstructor方法来调用特定的构造函数。

  (4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic private)和实现详细信息(如abstractvirtual)等。使用TypeGetMethodsGetMethod方法来调用特定的方法。

  (5)使用FiedInfo了解字段的名称、访问修饰符(如publicprivate)和实现详细信息(如static)等,并获取或设置字段值。

  (6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。

  (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

  (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

  System.Reflection.Emit命名空间的类提供了一种特殊形式的反射,可以在运行时构造类型。

  反射也可用于创建称为类型浏览器的应用程序,使用户能够选择类型,然后查看有关选定类型的信息。

  此外,Jscript等语言编译器使用反射来构造符号表。System.Runtime.Serialization命名空间中的类使用反射来访问数据并确定要永久保存的字段,System.Runtime.Remoting命名空间中的类通过序列化来间接地使用反射。

( 1 ) 反射什么时候可以使用:

使用反射工厂的优点是极大地减少了工厂类的数量、降低了代码的冗余,并且系统更容易扩展,在增加新类型后,不需要修改工厂类。理论上可以用一个工厂完成很多类型的实例化。多类型的实例化可以通过反射轻松实现。

但是,相应地反射得消耗是非常大的,使用时应该首先考虑清楚这一点。

( 2 )反射入门(一些简单实例)

实例1

在程序去得时动态实例化对象,获得对象的属性,并调用对象的方法。

1Namespace ReflectionExample

2{

3 class Class1

4 {

5 [STAThread]

6 static void Main (string [ ] args)

7 {

8  System.Console.WriteLine(“列出程序集中的所有类型”);

9  Assembly a = Assembly.LoadFrom (ReflectionExample.exe);

10  Type[ ] mytypes = a.GetTypes( );

11

12  Foreach (Type t in mytypes) //循环所有类型Type

13  {

14   System.Console.WriteLine ( t.Name );

15  }

16  System.Console.ReadLine ( );

17  System.Console.WriteLine (“列出HellWord中的所有方法” );

18  Type ht = typeof(HelloWorld);

19  MethodInfo[] mif = ht.GetMethods();

20  foreach(MethodInfo mf in mif) //循环所有方法MethodInfo[]

21  {

22   System.Console.WriteLine(mf.Name);

23  }

24  System.Console.ReadLine();

25  System.Console.WriteLine("实例化HelloWorld,并调用SayHello方法");

26  Object obj = Activator.CreateInstance(ht);

27  string[] s = {"zhenlei"};

28  Object bojName = Activator.CreateInstance(ht,s); // 实例化CreateInstance

29  BindingFlags flags = (BindingFlags.NonPublic|BindingFlags.Public|BindingFlags.Static|BindingFlags.Instance|BindingFlags.DeclaredOnly);

30  MethodInfo msayhello = ht.GetMethod("SayHello");

31  msayhello.Invoke(obj,null); //调用方法Invoke

32  msayhello.Invoke(objName,null);

33  System.Console.ReadLine();

34  }

35 }

36}

1using System; //被使用的Dll

2namespace ReflectionExample

3{

4  public class HelloWorld

5  {

6   string myName = null;

7   public HelloWorld(string name)

8   {

9    myName = name;

10   }

11   public HelloWorld() : this(null)

12   {}

13   public string Name

14   {

15    get

16    {

17     return myName;

18    }

19   }

20   public void SayHello()

21   {

22    if(myName == null)

23    {

24     System.Console.WriteLine("Hello World");

25    }

26    else

27    {

28     System.Console.WriteLine("Hello," + myName);

29    }

30   }

31  }

32}

33

实例2

用反射调用任意.net库中的方法(函数中含详尽解述)

函数如下:ReturnMessage自定议类

2、通过NameSpaceAndClassNameMethodName实际上就可以精确定位一个方法了如调用abc.dll里的namespace1.Class1.Main,调用起来就是CallAssembly("abc.dll","namespace1.Class1","Main",null)

public static ReturnMessage CallAssembly(string Path,string NameSpaceAndClassName,string MethodName,object[] Parameters)

{

try

{

Assembly Ass=Assembly.LoadFrom(Path);//调入文件(不限于dll,exe亦可,只要是.net)

Type TP=Ass.GetType(NameSpaceAndClassName);//NameSpaceAndClassName"名字空间.类名","namespace1.Class1"

MethodInfo MI=TP.GetMethod(MethodName);//MethodName是要调用的方法名,"Main"

object MeObj=System.Activator.CreateInstance(TP);

MI.Invoke(MeObj,Parameters);//Parameters是调用目标方法时传入的参数列表

return new ReturnMessage(true,"成功调用",1);

}

catch(Exception e)

{

return new ReturnMessage(false,"出现异常,消息为:"+e.Message,-1,e);

}

}

实例3

(1)namespace ClassLibrarySport

{

public abstract class Sport

{

protected string name;

public abstract string GetName();

public abstract string GetDuration();

}

}

= = = = = == = == = == = == = == = == = == = == = == = == = == = == = == = == =

(2)

namespace ClassLibrarySomeSports//该项目添加了对(1)的引用

{

public class Football : ClassLibrarySport.Sport

{

public Football()

{

name = "Football";

}

public override string GetName()

{

return name;

}

public override string GetDuration()

{

return "four 15 minute quarters";

}

}

}

= = = = = == = == = == = == = == = == = == = == = == = == = == = == = == = == =

(3)namespace ConsoleAssemblyTest//该项目添加了对(1)的引用

{

class Program

{

static void Main(string[] args)

{

Assembly assembly = Assembly.LoadFrom(@"E:\ClassLibrarySomeSports\bin\Debug\ClassLibrarySomeSports.dll");

<span

分享到:
评论

相关推荐

    三层架构(工厂与反射)

    三层架构是一种常见的软件设计模式,通常用于构建大型、复杂的企业级应用。这种架构将应用程序分为三个主要层次:表现层(Presentation Layer)、业务逻辑层(Business Logic Layer)和数据访问层(Data Access ...

    北大青鸟ACCP5.0 S2 .NET C#三层架构 三层+实体+简单工厂+接口+反射 代码实例

    在IT行业中,尤其是在软件开发领域,三层架构是一种常见的设计模式,它将应用程序分为表现层、业务逻辑层和数据访问层,以实现良好的模块化和可维护性。北大青鸟ACCP5.0 S2课程中涉及到的.NET C#三层架构正是这种...

    c#三层+抽象工厂实现+类似抽象工厂反射实现

    在给定的标题和描述中,主要涉及了两种设计模式:三层架构(Three-Tier Architecture)和抽象工厂模式(Abstract Factory Pattern),以及C#中的反射(Reflection)技术。下面将详细阐述这三个知识点。 首先,**三...

    .NET OA三层架构

    .NET OA三层架构是一种常见的软件开发模式,主要用于构建大型企业级应用,如办公自动化(OA)系统。这种架构设计旨在提高代码的可维护性、可扩展性和可重用性,通过明确地划分各层职责,使得系统更加模块化。 1. **...

    反射工程+多层架构+log4net日志

    利用反射,开发者可以编写更加灵活的代码,比如在不预先知道具体类名的情况下加载和实例化对象,或者在运行时检查和修改对象的行为。 接下来,我们来看看“多层架构”。在软件设计中,多层架构是一种常见的分层设计...

    一个的.net2005 C#写的记账本三层结构源码

    这是一个基于.NET Framework 2.0和C#编程语言编写的三层架构记账本应用程序源代码。这个项目展示了如何在实际开发中应用高级编程技术,如接口(Interfaces)、反射(Reflection)、泛型(Generics)以及LINQ...

    NET面试题及答案NET面试题及答案

    .NET框架的核心知识点包括反射、序列化、对象关系映射(O/R Mapping)、访问修饰符、字符串处理、类与结构的区别、远程方法调用(Remoting)和Web服务、代码-behind技术、三层架构以及MVC模式。以下是这些知识点的...

    JAVA—sql 笔试常见题

    - **多层结构**:J2EE 支持多层架构设计,允许开发者将应用逻辑分布在多个物理或逻辑层上,包括但不限于客户端层、Web 层、业务层以及企业信息系统层(EIS)。 - **分布式特性**:支持跨网络的组件通信和服务调用,...

    一个来自菜鸡的RPC实现

    2. **反射(Reflection)**:Java的反射API允许我们在运行时动态地获取类的信息并调用其方法。在RPC中,反射被用来根据接口动态创建代理对象,以及在远程服务上执行方法。 3. **序列化与反序列化(Serialization & ...

    23_软件构架设计总结.pdf

    - **Reflection**:反射机制。 - **Threading**:多线程支持。 - **Runtime**:运行时环境。 - **InteropServices**:实现原生代码与托管代码之间的交互。 - **Remoting**:远程对象调用。 - **Serialization**:...

    java面试八股文.pdf

    13. **反射(Reflection)** - 动态获取类的信息(如方法、字段等)并操作对象。 - 通常用于框架开发或自动生成代码的场合。 14. **equals方法和==的区别** - `equals`:用于比较两个对象的内容是否相等。 - `==`...

    C#面试试题

    3. 三层架构实现学生考试成绩查询与修改: - UI 层:使用字符串或 XML 作为数据交换格式,如 JSON 或 XML,封装查询请求和接收响应。 - BLL 层:处理业务逻辑,调用 DAL 层接口,进行数据操作,并记录审计日志。 - ...

    .net基础收集汇总

    三层架构的优点在于分离关注点,提高系统的可维护性和可扩展性。 ***是.NET框架中用于数据访问的组件。 它使用到的关键类包括SqlConnection、SqlDataAdaptor、DataSet、SqlCommand、SqlDataReader等,它们支持与...

    PHP和MySQL Web开发第4版pdf以及源码

    6.3 类的实例化 6.4 使用类的属性 6.5 使用private和public关键字控制访问 6.6 类操作的调用 6.7 在PHP中实现继承 6.7.1 通过继承使用private和protected访问修饰符控制可见性 6.7.2 重载 6.7.3 使用final...

    PHP和MySQL WEB开发(第4版)

    6.3 类的实例化 6.4 使用类的属性 6.5 使用private和public关键字控制访问 6.6 类操作的调用 6.7 在PHP中实现继承 6.7.1 通过继承使用private和protected访问修饰符控制可见性 6.7.2 重载 6.7.3 使用final关键字禁止...

    PHP和MySQL Web开发第4版

    6.3 类的实例化 6.4 使用类的属性 6.5 使用private和public关键字控制访问 6.6 类操作的调用 6.7 在PHP中实现继承 6.7.1 通过继承使用private和protected访问修饰符控制可见性 6.7.2 重载 6.7.3 使用final...

    整理后java开发全套达内学习笔记(含练习)

    Reflection [java] 反射 [ri'flekʃәn] script n.手写体,小型程序 [skript] serialized vt.序列化,串行化 ['siәriәlaiz]'(serializable adj.)(deserialize反序列化,反串行化) Socket [java] 网络套接字['sɒkit...

Global site tag (gtag.js) - Google Analytics