詳解C#特性和反射(四)

来源:https://www.cnblogs.com/minotauros/archive/2018/10/09/9760903.html
-Advertisement-
Play Games

本篇內容是特性和反射的最後一篇內容,前面三篇文章: 詳解C#特性和反射(一) 詳解C#特性和反射(二) 詳解C#特性和反射(三) 一、晚期綁定(Late Binding)是一種在編譯時不知道類型及其成員,而在運行時創建指定類型的實例並調用其成員的技術,使用命名空間System中的Activator類 ...


  本篇內容是特性和反射的最後一篇內容,前面三篇文章:

詳解C#特性和反射(一)

詳解C#特性和反射(二)

詳解C#特性和反射(三)

 

  一、晚期綁定(Late Binding)是一種在編譯時不知道類型及其成員,而在運行時創建指定類型的實例並調用其成員的技術,使用命名空間System中的Activator類來實現晚期綁定,例如:

    Type myType = Type.GetType(myClassName);  //首先獲取類型信息
    object myObj = Activator.CreateInstance(myType);  //通過Activator根據類型信息創建對象
    //如果獲取的類型可以獲取到,即位於當前程式集,可以使用強制轉換或as運算符得到該類型的變數,然後直接調用該對象的成員:
    //MyClass myClass = (MyClass)myObj;
    //也可以使用CreateInstance的泛型重載方法直接獲取該類型的變數:
    //MyClass myClass = Activator.CreateInstance<MyClass>();
    //如果獲取的類型不確定或當前程式編譯時並沒有引入該類型所在的命名空間,則需要通過反射訪問該類型的成員:
    MethodInfo methodInfo = myType.GetMethod(methodName);  //獲取類型中的方法信息
    methodInfo.Invoke(myObj, null);  //調用類型中的無參實例方法

   ※靜態方法CreateInstance會調用匹配度最高的構造函數構建對象,例子中的CreateInstance(Type type)和CreateInstance<T>()只會調用目標類型中無參的公有構造函數,當目標類型中沒有無參的公有構造函數時會拋出異常MissingMethodException;Activator類中提供多個CreateInstance的重載方法以調用不同的構造函數並傳入參數,這裡不再一一介紹,用到時查看定義即可看到所有的方法聲明;

  二、使用晚期綁定技術也會打破單例模式中的對象唯一性:

    public class MyClass
    {
        public static MyClass Instace = new MyClass();
        private MyClass()
        {
            Console.WriteLine("MyClass's Constructor Execute.");
        }
        public int MyFiled;
    }

    public class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Access the static member Instace of MyClass.");
            MyClass.Instace.MyFiled = 10;
            Console.WriteLine("Use the Activator class to create instance of MyClass.");
       //通過CreateInstance的重載方法調用目標類型的私有構造函數 MyClass myObj
= (MyClass)Activator.CreateInstance(typeof(MyClass), true); Console.WriteLine($"Instace of MyClass's MyFiled is {MyClass.Instace.MyFiled}, myObj's MyFiled is {myObj.MyFiled}."); Console.Read(); } }

  輸出結果為(在.Net Core下運行,不同平臺下靜態成員的初始化時機略有不同,會導致這裡第一行和第二行輸出順序不一致):

Access the static member Instace of MyClass.
MyClass's Constructor Execute.
Use the Activator class to create instance of MyClass.
MyClass's Constructor Execute.
Instace of MyClass's MyFiled is 10, myObj's MyFiled is 0.

因此在使用單例模式時,應當避免使用晚期綁定創建對象,而應使用反射獲取單例中的靜態成員Instance;

 


如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的認可是我寫作的最大動力!

作者:Minotauros
出處:https://www.cnblogs.com/minotauros/

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、java中equals和==的區別 值類型是存儲在記憶體中的堆棧(簡稱棧),而引用類型的變數在棧中僅僅是存儲引用類型變數的地址,而其本身則存儲在堆中。2、==操作比較的是兩個變數的值是否相等,對於引用型變數表示的是兩個變數在堆中存儲的地址是否相同,即棧中的內容是否相同。3、equals操作表示的兩 ...
  • 題意 "題目鏈接" Sol 很顯然的一個dp方程 $f_i = min(f_j + (sum_i sum_j 1 L)^P)$ 其中$sum_i = \sum_{j = 1}^i len_j + 1$ 這個東西顯然是有決策單調性的。 單調隊列優化一下 我好像已經做過三個這種類型的題了,而且轉移的時候 ...
  • 二叉搜索樹的後序遍歷序列: 輸入一個整數數組,判斷該數組是不是某二叉搜索樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的數組的任意兩個數字都互不相同。 思路: 1.後序遍歷是 左右中 , 最後一個元素是根結點 2.二叉搜索樹,左子樹=end return true root=seq[... ...
  • 最近才開始學習ASP.NET Core,發現社區的學習資料很多,但是相關的視頻教程不是很多,52ABP官方有兩個視頻教程,但是ABP框架比較臃腫,初學者學起來有點吃力,所以還是推薦大家先啃書或者官方文檔,有點基礎知識了再看視頻教程學習,個人覺得這樣學起來比較好一點。經過一段時間的學習後我找到一些相關... ...
  • ORM-SqlRepoEx 是 .Net平臺下相容.NET Standard 2.0,一個實現以Lambda表達式轉轉換標準SQL語句,使用強類型操作數據的輕量級ORM工具,在減少魔法字串同時,通過靈活的Lambda表達式組合,實現業務數據查詢的多樣性。 ...
  • Http協議,底層的東西還是不是特別熟悉,感覺要經過沉澱之後才能理解這些東西吧 1.Asp.net生命周期 Asp.net生命周期: 從發起請求開始,到IIS進行處理的全部過程,然後再到獲取結果 當請求一個*.aspx文件的時候,這個請求會被inetinfo.exe進程截獲,它判斷文件的尾碼(asp ...
  • 從來沒想到過能在這個上面翻車,感慨自學沒有培訓來得系統啊,廢話不多說 ORM:對象關係映射(Object Relational Mapping,簡稱ORM,或O/RM,或O/R mapping),是一種程式技術,用於實現面向對象編程語言里不同類型系統的數據之間的轉換 EF:數據持久化 是將記憶體中的數 ...
  • 情景如下:一個客戶端要訪問一個api,不需要用戶登錄,但是又不想直接暴露api給外部使用,這時可以使用identityserver添加訪問許可權。 客戶端通過clientid和secrect訪問identitserver的Token Endpoint,獲取accesstoken; 接著客戶端再使用ac ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...