C#學習筆記12。本站提示廣大學習愛好者:(C#學習筆記12)文章只能為提供參考,不一定能成為您想要的結果。以下是C#學習筆記12正文
1.在運用反射時,反射可以繞過平安訪問級別(private、protected)修飾的類或屬性,來獲取需求的信息。
2.泛型的反射:可以運用Type.ContainsGenericParameters這個屬性來判別一個類或辦法能否包括尚未設置的泛型實參,Type.IsGenericType屬性表示能否為泛型類型。
3.特性(Attribute):可以運用特性修飾類、接口。構造、枚舉、委托、事情、屬性、字段、辦法、結構器、索引器、參數、類型參數、前往值、順序集、模塊,運用特性的語法有2種,可為多個“[特性類型]”或“[特性類型,特性類型]”。關於其中列出少數結構來說,都可以運用下面的語法標志,但是這個語法不合適“前往值、順序集、模塊”。
(1)順序集,[assembly:特性名]。
(2)模塊,[module:特性名]。
(3)前往值,[return:特性名]。
4.大少數特性只針對特定的結構停止修飾,為了防止特性不恰當的運用,可以運用[AttributeUsageAttribute(AttributeTargets.xxx)]特性類停止標志特性限制。
5.具名參數:如[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]語法有別於結構器初始化語法,由於AttributeUsageAttribute類並不包括兩個參數的結構器,雖然C#4.0支持命名參數,但也是指定辦法自身所需的參數。具名參數是用於在特性結構器調用中設置特定的公共屬性和字段,即便結構器不包括對應的參數,具名參數雖然是可選的,但它允許對特性的額定實例數據停止設置,同時無需提供一個對應的結構器參數。
6.序列化(Serializable):實質上System.Runtime,Serialization.SerializationInfo對象是由“稱號/值”對構成的集合。在完成自定義的序列化時(需求完成ISerializable接口),內中會運用到SerializationInfo對象。
7.靜態編程(Dynamic):反射的關鍵功用之一就是靜態查找和調用特定類型的一個成員,這需求在執行時辨認成員名或其他特征。在C#4.0中新增的靜態編程-Dynamic,提供一個更復雜的方法來經過反射調用成員,但這個技術的限制在於,編譯時需求知道成員名和簽名。若執行時發現現實上沒有這個成員,調用就會引發一個RuntimeBinderException異常。可檢查UseDynamic.Test()代碼。
8.Dynamic:究其基本,Dynamic是一個Object,存在任何對象都能隱式轉換成Dynamic,Dynamic可以顯式轉換成其他對象,所以Dynamic外行為上好像Object,相似於Object,它甚至為它的默許值前往null(default(dynamic))。dynamic特殊靜態行為只在調用時才會呈現,這個行為是它與Object區分開來的關鍵。任何dynamic的成員調用都會前往為dynamic類型,但若對Dynamic執行GetType(),會前往是編譯好的類型(即最後賦值給靜態變量的類型)。
9.完成自定義靜態對象:定義自定義靜態類型的關鍵是完成System.Dynamic.IDynamicMetaObjectProvider接口,但是不用從頭完成,相反首先的方案是從System.Dynamic.DynamicObject類承繼,偏重寫相應的辦法。DynamicObject類曾經完成了IDynamicMetaObjectProvider接口,提供了默許處置。可檢查代碼DynamicXml類,UseDynamic類中2個辦法NormalMethod()與DynamicMethod()兩者的比擬。NormalMethod()辦法運用普通的xml數據讀取,DynamicMethod()辦法運用了自定義靜態對象解析xml內容。
[Serializable] [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class MyDescriptionAttribute : Attribute { } public class UseDynamic { public static void Test() { dynamic data = "Hello! My name is Inigo Montoya"; Console.WriteLine(data); data = (double)data.Length; data = data * 3.5 + 28.6; if (data == 2.4 + 112 + 26.2) { Console.WriteLine("data for length : {0}", data); } else { data.NonExistentMethodCallStillCompiles(); } } public static void NormalMethod() { XElement person = XElement.Parse("<Person><Name>主神</Name><Age>26</Age></Person>"); Console.WriteLine("{0},{1}", person.Descendants("Name").FirstOrDefault().Value, person.Descendants("Age").FirstOrDefault().Value); } public static void DynamicMethod() { dynamic person = DynamicXmL.Parse("<Person><Name>主神</Name><Age>26</Age></Person>"); Console.WriteLine("{0},{1}", person.Name, person.Age); } } /// <summary> /// 完成自定義的靜態對象 /// </summary> public class DynamicXmL : DynamicObject { private XElement element; public DynamicXmL(XElement xElement) { element = xElement; } public static dynamic Parse(string text) { return new DynamicXmL(XElement.Parse(text)); } public override bool TryGetMember(GetMemberBinder binder, out object result) { bool success = false; result = null; XElement firstDescendant = element.Descendants(binder.Name).FirstOrDefault(); if (firstDescendant != null) { if (firstDescendant.Descendants().Count() > 0) { result = new DynamicXmL(firstDescendant); } else { result = firstDescendant.Value; } success = true; } return success; } public override bool TrySetMember(SetMemberBinder binder, object value) { bool success = false; XElement firstDescendant = element.Descendants(binder.Name).FirstOrDefault(); if (firstDescendant != null) { if (value.GetType() == typeof(XElement)) { firstDescendant.ReplaceWith(value); } else { firstDescendant.Value = value.ToString(); } success = true; } return success; } }View Code
-----------------以上內容依據《C#實質論 第三版》停止整理