c#反射机制学习和利用反射获取类型信息

前端技术 2023/09/06 C#

1、.NET可执行应用程序结构

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

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

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

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

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

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

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

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

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

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

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

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

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

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

复制代码 代码如下:

using System;
using System.Reflection;

namespace ReflectionExample
{
class Class1
{
   [STAThread]
   static void Main(string[] args)
   {
    System.Console.WriteLine(\"列出程序集中的所有类型\");
    Assembly a = Assembly.LoadFrom(\"ReflectionExample.exe\");

    Type[] mytypes = a.GetTypes();

    foreach(Type t in mytypes)
    {
     System.Console.WriteLine ( t.Name );
    }
    System.Console.ReadLine();

    System.Console.WriteLine(\"列出HelloWorld中的所有方法\");

    Type ht = typeof(HelloWorld);

    MethodInfo [] mif = ht.GetMethods ();

    foreach(MethodInfo mf in mif)
    {
     System.Console.WriteLine(mf.Name);
       }

    System.Console.ReadLine();

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

    Object obj = Activator.CreateInstance(ht);

    string [] s = {\"ZhenLei\"};

    Object objName = Activator.CreateInstance(ht,s);

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

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

    msayhello.Invoke(obj,null);

    msayhello.Invoke(objName,null);

    System.Console.ReadLine();


   }


   }
}

using System;

namespace ReflectionExample
{
/// <summary>
/// HelloWorld 的摘要说明。
/// </summary>
public class HelloWorld
{
   string myName = null;

   public HelloWorld(string name)
   {
    myName = name;
   }
   public HelloWorld() : this(null)
   {

   }

   public string Name
   {
    get
     {return myName;}
   }

   public void SayHello()
   {
    if (myName==null)
     System.Console.WriteLine (\"Hello World\");
    else
     System.Console.WriteLine(\"Hello,\" + myName);
   }

}
}

本文地址:https://www.stayed.cn/item/15387

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。