(原创)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");
        }
    }
}

  

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. 运用 FieldInfo 发现以下信息:字段的称号、访问修饰符(如 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);
            }