程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#學習筆記12

C#學習筆記12

編輯:C#入門知識

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#實質論 第三版》停止整理

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