程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C#基礎概念二十五問(20)

C#基礎概念二十五問(20)

編輯:關於C語言

25.什麼是反射?

答:

反射,Reflection,通過它我們可以在運行時獲得各種信息,如程序集、模塊、類型、字段、屬性、方法和事件

通過對類型動態實例化後,還可以對其執行操作

簡單來說就是用string可以在runtime為所欲為的東西,實際上就是一個.Net framework內建的萬能工廠

一般用於插件式框架程序和設計模式的實現,當然反射是一種手段可以充分發揮其能量來完成你想做的任何事情(前面好象見過一位高人用反射調用一個官方類庫中未說明的函數。。。)

示例:

using System;
using System.Collections.Generic;
using System.Text;
namespace Example25Lib
{
  public class Class1
  {
    private string name;
    private int age;
    //如果顯式的聲明了無參數構造函數,客戶端只需要用程序集的CreateInstance即可實例化該類
    //在此特意不實現,以便在客戶調用端體現構造函數的反射實現
    //public Class1()
    //{
    //}
    public Class1(string Name, int Age)
    {
      name = Name;
      age = Age;
    }
    public void ChangeName(string NewName)
    {
      name = NewName;
    }
    public void ChangeAge(int NewAge)
    {
      age = NewAge;
    }
    public override string ToString()
    {
      return string.Format("Name: {0}, Age: {1}", name, age);
    }
  }
}

反射實例化對象並調用其方法,屬性和事件的反射調用略去

using System;
using System.Collections.Generic;
using System.Text;
//注意添加該反射的命名空間
using System.Reflection;
namespace Example25
{
  class Program
  {
    static void Main(string[] args)
    {
      //加載程序集
      Assembly tmpAss = Assembly.LoadFile(AppDomain.CurrentDomain.BaseDirectory + "Example25Lib.dll");
      //遍歷程序集內所有的類型,並實例化
      Type[] tmpTypes = tmpAss.GetTypes();
      foreach (Type tmpType in tmpTypes)
      {
        //獲取第一個類型的構造函數信息
        ConstructorInfo[] tmpConsInfos = tmpType.GetConstructors();
        foreach (ConstructorInfo tmpConsInfo in tmpConsInfos)
        {
          //為構造函數生成調用的參數集合
          ParameterInfo[] tmpParamInfos = tmpConsInfo.GetParameters();
          object[] tmpParams = new object[tmpParamInfos.Length];
          for (int i = 0; i < tmpParamInfos.Length; i++)
          {
            tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
            if (tmpParamInfos[i].ParameterType.FullName == "System.String")
            {
              tmpParams[i] = "Clark";
            }
          }
          //實例化對象
          object tmpObj = tmpConsInfo.Invoke(tmpParams);
          Console.WriteLine(tmpObj);
          //獲取所有方法並執行
          foreach (MethodInfo tmpMethod in tmpType.GetMethods())
          {
            //為方法的調用創建參數集合
            tmpParamInfos = tmpMethod.GetParameters();
            tmpParams = new object[tmpParamInfos.Length];
            for (int i = 0; i < tmpParamInfos.Length; i++)
            {
              tmpParams[i] = tmpAss.CreateInstance(tmpParamInfos[i].ParameterType.FullName);
              if (tmpParamInfos[i].ParameterType.FullName == "System.String")
              {
                tmpParams[i] = "Clark Zheng";
              }
              if (tmpParamInfos[i].ParameterType.FullName == "System.Int32")
              {
                tmpParams[i] = 27;
              }
            }
            tmpMethod.Invoke(tmpObj, tmpParams);
          }
          //調用完方法後再次打印對象,比較結果
          Console.WriteLine(tmpObj);
        }
      }
      Console.ReadLine();
    }
  }
}

結果:

Name: Clark, Age: 0

Name: Clark Zheng, Age: 27

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved