C#(原创)C#反射知识分享之一

本身来源于我在就学JAVA的反光过程中,想打听一下C#的反光过程,所以写了一晃学问总计,希望能为后来者的有的帮衬

反射提供了描述程序集、模块和花色的目的(
Type 类型)。
可以拔取反射动态创设类型的实例,将项目绑定到现有对象,或从现有对象获得项目并调用其艺术或访问其字段和总体性。假设代码中应用了特征,可以利用反射来访问它们。

 我自成立供反射测试的类库如下:分别是Class  Car and Class Deep

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

namespace ClassLibrary1
{
    class deep:Car
    {
        private string name;
        public void run()
        {
            System.Console.WriteLine("deep run method");
        }
    }
}

C#,  

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

namespace ClassLibrary1
{
    public class Car
    {
        private string name;
        public int i;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public void run()
        {
            System.Console.WriteLine("car run method");
        }

        public string myReturnMethod(string abc)
        {
            System.Console.WriteLine("car run myReturnMethod");
            return abc;
        }

        //protected void run()
        //{
        //    System.Console.WriteLine("car run method");
        //}

    }
}

 

 

  1. 运用 Assembly
    类可以加载程序集、浏览程序集的元数据和重组部分、发现先后集中包含的品种以及开创这么些项目标实例。

Assembly 类的多多成员都提供关于程序集的音讯

  • GetName 方法再次来到一个 AssemblyName
    对象,该目的提供对程序集体现名称部分的造访。
  • GetCustomAttributes 方法列出应用于程序集的属性。
  • GetFiles 方法提供对程序集清单中文件的拜会。
  • GetManifestResourceNames 方法提供程序集清单中资源的称呼。

 

1.1 若要获取 Assembly
对象(表示目前加载到应用程序域(例如,简单项目的默认使用程序域)中的程序集)的数组,可以采取AppDomain ..::. GetAssemblies 方法。

 

AppDomain currentDomain = AppDomain.CurrentDomain;
 //获取当前 Thread 的当前应用程序域。
  Assembly[] assems = currentDomain.GetAssemblies();
 //获取已加载到此应用程序域的执行上下文中的程序集。

  Console.WriteLine("List of assemblies loaded in current appdomain:");
  foreach (Assembly assem in assems)
  {
      Console.WriteLine(assem.ToString());
 }

  

1.2加载程序集的引荐模式是接纳 Load
方法,该格局标识要由其出示名称加载的先后集

  //调用非本先后的DLL ,注意这里的ClassLibrary1是自我写的类库文件

Assembly assem = Assembly.Load("ClassLibrary1, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null");
//或者使用下面语句代替前一语句
//Assembly assem = Assembly.LoadFrom("ClassLibrary1.dll");
            Console.Write(assem.FullName);
            AssemblyName assemName = assem.GetName();
            Console.WriteLine("\nName: {0}", assemName.Name);
            Console.WriteLine("Version: {0}.{1}",
                assemName.Version.Major, assemName.Version.Minor);

///查看该类库下的所有类名     
int i,j;
            Type[] types = assem.GetTypes();
            //获取类名
            for (i = 0; i < types.GetLength(0); ++i)
            {
                Console.WriteLine(types[i].Name);
            }
    1. 利用 Field(Field)Info 发现以下信息:字段的称呼、访问修饰符(如 public 或
      private)和落实详细信息(如 static)等;并拿走或设置字段值。

   这里大概取得该类库中的第一个类作例子

 Type mytype = types[0];
            FieldInfo[] myFieldInfo;
            myFieldInfo = mytype.GetFields(BindingFlags.NonPublic | BindingFlags.Instance
            | BindingFlags.Public);

            for (i = 0; i < myFieldInfo.Length; i++)
            {
                Console.WriteLine("\nName            : {0}", myFieldInfo[i].Name);
                Console.WriteLine("Declaring Type  : {0}", myFieldInfo[i].DeclaringType);
                Console.WriteLine("IsPublic        : {0}", myFieldInfo[i].IsPublic);
                Console.WriteLine("MemberType      : {0}", myFieldInfo[i].MemberType);
                Console.WriteLine("FieldType       : {0}", myFieldInfo[i].FieldType);
                Console.WriteLine("IsFamily        : {0}", myFieldInfo[i].IsFamily);
            }

 

相关文章