【讀書筆記】C#高級編程 第十五章 反射

来源:http://www.cnblogs.com/dlxh/archive/2017/04/18/6725925.html
-Advertisement-
Play Games

(一)在運行期間處理和檢查代碼 自定義特性允許把自定義元數據與程式元素關聯起來。反射是一個普通術語,它描述了在運行過程中檢查和處理程式元素的功能。例如,反射允許完成的任務: 枚舉類型的成員 實例化新對象 執行對象的成員 查找程式集的信息 檢查應用於某種類型的自定義特性 創建和編譯新程式集 (二)自定 ...


(一)在運行期間處理和檢查代碼

自定義特性允許把自定義元數據與程式元素關聯起來。反射是一個普通術語,它描述了在運行過程中檢查和處理程式元素的功能。例如,反射允許完成的任務:

  • 枚舉類型的成員
  •  實例化新對象
  •  執行對象的成員
  •  查找程式集的信息
  •  檢查應用於某種類型的自定義特性
  •  創建和編譯新程式集

 

 

(二)自定義特性

使自定義特性非常強大的因素時使用反射,代碼可以讀取這些元數據,使用它們在運行期間作出決策。

 

1、編寫自定義特性

定義一個FieldName特性:

[AttributeUsage(AttributeTargets.Property, AllowMultiple = false, Inherited = false)]
public class FieldNameAttribute : Attribute
{
    private string name;
    public FieldNameAttribute(string name)
    {
        this.name = name;
    }
}

 

(1)AttributeUsage特性

特性類本身用一個特性——System.AttributeUsage特性來標記。AttributeUsage第一個參數用於標識自定義特性可以應用到那些類型的程式元素上,其類型是枚舉類型AttrubuteTargets。

當應用類型超過1個時,可以用OR運算符連接:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
AllowMultiple屬性用於指定該特性是否可以多次應用於同一項上,當設置為false,以下編碼會報錯:
[FieldName("我的屬性1")]
[FieldName("我的屬性2")]
public int MyProperty { get; set; }
Inherited屬性用於指示使用該特性的類或類成員能否由派生類或重寫成員繼承。

 

(2)指定特性參數

編譯器會檢查傳遞給特性的參數,並查找該特性中帶這些參數的構造函數。一半僅提供一個構造函數,使用屬性來定義任何其他可選參數。

 

(3)指定特性的可選參數

另一種語法,可把可選參數添加到特性中。這種語法指定可選參數的名稱和值,它通過特性類中的公共屬性或欄位起作用。例如上述代碼中AttributeUsage特性使用的AllowMultiple和Inherited就是使用的這種語法。

 

 

(三)反射

通過System.Type類可以訪問關於任何數據類型的信息。System.Reflection.Assembly類可以用於訪問給定程式集的相關信息,或者把這個程式集載入到程式中。

 

1、System.Type類

Type有與每種數據類型對應的派生類。獲取指定任何給定類型的Type引用有3中常用方式:

使用C#的typeof運算符:

Type type = typeof(double);

使用GetType()方法(所有的類都會從System.Object繼承這個方法):

double d = 10.0;
Type type = d.GetType();

使用Type類的靜態方法GetType():

Type type = Type.GetType("System.Double");

 

(1)Type的屬性

 1 class Program
 2 {
 3     static void Main(string[] args)
 4     {
 5         Type intType = typeof(int);
 6         Console.WriteLine("當前類型的類型名:"+intType.Name);
 7         Console.WriteLine("當前類型的類型完全限定名:" + intType.FullName);
 8         Console.WriteLine("當前類型的名稱空間名:" + intType.Namespace);
 9         Console.WriteLine("當前類型的直接基類名:" + intType.BaseType);
10         Console.WriteLine("當前類型的.NET運行庫中映射到的類型:" + intType.UnderlyingSystemType);
11         Console.WriteLine("是否為數組的:" + intType.IsArray);
12         Console.WriteLine("是否為值類型:" + intType.IsValueType);
13     }
14 }
15 public class MyBaseClass { }
16 public class MyClass : MyBaseClass { }

運行以上代碼,結果如下:

 

還有很多IsXXX來判斷是否為某種類型。

 

(2)方法

System.Type類的大多數方法都用於獲取對應數據類型的成員信息:構造函數、屬性、方法和事件。尾碼加‘s’的表示獲取當前數據類型中所有的成員相關信息,不加則只獲取數據類型中一個成員的相關信息。

Type intType = typeof(int);
var method = intType.GetMethod("GetHashCode");
var methods = intType.GetMethods();
foreach (var item in methods)
{}

System.Type類還包含有GetConstructor()方法和GetConstructors()等。

 

2、Assembly類

Assembly類在System.Reflection名稱空間中定義,它允許訪問給定程式集的元數據,它也包含可以載入和執行程式集(假定該程式集是可執行的)的方法。可以使用靜態成員Assembly.Load()或Assembly.LoadFrom()。

使用Load()載入:

Assembly assembly1 = Assembly.Load("程式集名");

使用LoadFrom()載入:

Assembly assembly2 = Assembly.LoadFrom("程式集實際路徑");

載入程式集後就可以使用它的各種屬性進行查詢:

string name = assembly1.FullName;

 

(1)獲取在程式集中定義的類型的詳細信息

Assembly類的一個功能是它可以獲得在相應程式集中定義的所有類型的詳細信息,只要調用Assembly.GetTypes()方法,就可以返回一個包含所有類型的詳細信息的System.Type引用數組。

Type[] typeArray = assembly.GetTypes();

 

(2)獲取自定義特性的詳細信息

如果要確定程式集從整體上關聯了什麼自定義特性,就需要調用Attribute類的一個靜態方法GetCustomAttributes()。

Attribute[] definedAttributes = Attribute.GetCustomAttributes(assembly);

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

-Advertisement-
Play Games
更多相關文章
  • etc etcetera[ɛtsɛtərə]縮寫 等等的意思 放置一些其他文件 ...
  • 介紹: Layered Windows是windows視窗中的一類,提供類似半透明的效果(阿爾法混合)。半透明效果是字面上有能看出來的,但實際上根據MSND,該類型的視窗還能更好的支持非矩形的視窗,使之顯示效果更平滑流暢(暗地裡猜測是使用了硬體加速而達到的效果)。在win8之前WS_EX_LAYER ...
  • 1.在www.ailiyun.com上下載所需文件以CentOS為例,現將文件下下來 2.兩種掛載方式。 第一種,點旁邊的help文件 按照阿裡的提示完成操作。現將/etc/yum.repos.s/CentOS-Base.repo 備份(相當於更改尾碼名)。 再下載新的CentOS。有可能會提示wg ...
  • 添加命名空間 using System.Xml; 我自己的代碼(添加其中的節點) XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Server.MapPath("userTable.xml")); XmlNode root = xmlDoc.S ...
  • 2017-04-18 1 public class VisualTargetPresentationSource : PresentationSource 2 { 3 public VisualTargetPresentationSource(HostVisual hostVisual) 4 { 5 ...
  • 上篇博文中我們將模擬設備註冊到Azure IoT Hub中:我們得到了設備的唯一標識。 Azure IoT 技術研究系列2-設備註冊到Azure IoT Hub 本文中我們繼續深入研究,設備到雲、雲到設備通信。 1. 在Azure IoT Hub中接收模擬設備的消息 讀取設備到雲消息的Event H ...
  • 1.excel導入 public override string CheckAndImportFile(ref DataTable errorInfoDataTable) { porgressBar.SetProgress(5, "開始上傳文件到伺服器....."); //上傳文件到伺服器 file ...
  • 初學Xamarin ,各種折騰,大概這公司破電腦配置差,老是很多問題。 GitHub 真是個好東西,可以參考別人做的,不過下載來運行不了就各種折騰了,為此我重裝電腦兩次了,反正win10安裝就十幾分鐘的事。 問題一:沒有為此解決方案配置選中要生成的項目 這個問題的原因懶得找,可能是項目解決方案拷貝的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...