91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C#提高知識-001:反射的應用和原理(一)

發布時間:2020-07-12 17:21:05 來源:網絡 閱讀:254 作者:yangyoushan 欄目:編程語言

在項目中,程序集間的相互引用是經常遇到的。比如,主程序引用各分模塊,各分模塊引用公用程序集,以及平行的程序集間為了某些功能的實現也需要相互引用。這樣的引用一方面是迫不得已的選擇,而另一方面也反映出系統設計的水平。下面,簡單介紹一下C#中的一種機制——反射。反射可以在避免某些情況下的程序集引用問題,比如主程序引用各功能模塊的問題,當然其它模塊間也是可以用反射的,只是使用是否方便這些問題需要在使用前根據實際情況進行考慮。本文以主程序加載分模塊為例,介紹一下反射的使用。
所謂反射,就是對程序集或模塊利用基礎類型進行解析,然后還原出一個對象模型,在調用者工作域里運行的一個過程。其核心部分就是解析。工作原理是這樣的。
無論你創建的多么結構復雜的類,歸根結底都是由元數據構成的。如下,

public class Person
 {
     private string name;
     private int  age;
     private string content;
 }

在程序編譯時,編譯器會創建類型表,字段表,方法表或其它表。再利用System.Reflection命名空間中的包含的類型進行解析,也可以看成對比的過程,將要被反射的程序集中的表讀出,根據System.Reflection的基本類型,進行重組,從而還原出原來程序集的結構。
例如,序列化的過程就是使用了反射,序列化格式器將被序列化的對象中的字段的值獲取出來,然后寫入一個字節流,進行傳輸;因為字節流傳輸不容易出錯或信息丟失。接收到字節流后,根據基本類型再還原出原對象的模型。
反射中,System.Type類型很重要,它遍歷被反射的表中的類型和反射中的基本類型進行比較,然后判斷出當前是什么類型。
簡單了解了原理,那么再看如何使用的。
建一個工程,包含主程序和子程序集,如圖

C#提高知識-001:反射的應用和原理(一)

主程序生成在SetupApp文件夾中,子程序生成在\SetupApp\Library\中。
子程序的程序入口需要遵循一些約定,比如入口類名字需要都一樣,這樣才可統一加載。

namespace ReflecLibrary2
{
    public class MainWindow
    {
        public MainWindow()
        {
            Welcome();
        }
        private void Welcome()
        {
            Console.Write(@"當前程序為:ReflecLibrary2 ");
            Console.WriteLine(@"開始執行ReflecLibrary2!");
        }
    }
}
namespace ReflectLibrary1
{
    public class MainWindow
    {
        public MainWindow()
        {
            Welcome();
        }
        private void Welcome()
        {
            Console.Write(@"當前程序為:ReflectLibrary1 ");
            Console.WriteLine(@"開始執行ReflecLibrary1!");
        }
    }
}

然后看調用的部分,

class Program
    {
        static void Main(string[] args)
        {
            /////////////////////設置約定的規則,比如需要加載的程序的目錄,程序集程序入口的類///////////////////
            string startPath = AppDomain.CurrentDomain.BaseDirectory + @"Library\";
            string suffix=@".dll";
            string commonMainClass = @"MainWindow";
            DirectoryInfo directory = new DirectoryInfo(startPath);
            /////////////////////將程序集文件名讀入,這里其實只需要string類型的路徑即可,
            //////為了后面處理字符串方便所以才讀取文件信息
            var libraries = directory.GetFiles().OrderBy(o=>o.FullName);
            List<FileInfo> loadDlls = new List<FileInfo>();
            if (libraries != null)
            {
                foreach (FileInfo item in libraries)
                {
                    if (item.FullName.ToLower().EndsWith(suffix))
                    {
                        loadDlls.Add(item);
                    }
                }
            }
            /////////////////////執行程序集///////////////////
            //程序集1
            Assembly assembly1 = Assembly.LoadFile(loadDlls[0].FullName.Replace(@"/", @"\"));
            string typeName1 = loadDlls[0].Name.Replace(loadDlls[0].Extension,string.Empty) + @"." + commonMainClass;
            assembly1.CreateInstance(typeName1);
            //程序集2
            Assembly assembly2 = Assembly.LoadFile(loadDlls[1].FullName.Replace(@"/", @"\"));
            string typeName2 = loadDlls[1].Name.Replace(loadDlls[0].Extension, string.Empty) + @"." + commonMainClass;
            assembly2.CreateInstance(typeName2);
            Console.ReadLine();
        }

各個部分的作用都寫在了注釋中。
運行結果就是,程序集1和程序集2中的方法都執行了。當然這里只是為了方便說明只寫了一個方法,實際上
public MainWindow()
{
Welcome();
}
就是子程序的入口。
結果如下,

C#提高知識-001:反射的應用和原理(一)

那么反射我們就有了一個直觀的理解,里面的詳細原理,下一篇繼續介紹

代碼下載

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大渡口区| 洛宁县| 即墨市| 黎平县| 乳源| 乐山市| 宝丰县| 龙泉市| 康保县| 蓝田县| 郎溪县| 历史| 遂平县| 陵水| 大宁县| 苏尼特右旗| 崇文区| 慈溪市| 林口县| 德化县| 新建县| 大石桥市| 商丘市| 高陵县| 驻马店市| 云安县| 金门县| 葫芦岛市| 大庆市| 枣强县| 盈江县| 合肥市| 黄大仙区| 普宁市| 天长市| 玛纳斯县| 淳化县| 明溪县| 资源县| 长治县| 临颍县|