首頁 後端開發 C#.Net教程 .Net設定檔-反射+設定檔儲存類型實例

.Net設定檔-反射+設定檔儲存類型實例

Feb 24, 2017 am 10:26 AM

                設定檔+反射確實去除了選擇語句的繁瑣,帶來了美麗的趕腳!

              先改進了類別(接上文字):

namespace ClassLib
{
    /// <summary>
    /// Interface IGreetingStrategy
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:01:58</remarks>
    public interface IGreetingStrategy
    {
        string GreetingType { get; }
        void SetGreetingWords(ITextControl textContrl);
    }

    /// <summary>
    /// Class EnglishGreeting
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:02:38</remarks>
    public class EnglishGreeting : IGreetingStrategy
    {
        public string GreetingType
        {
            get { return "English"; }
        }

        public void SetGreetingWords(ITextControl textContrl)
        {
            textContrl.Text = "hello,readers";
        }
    }

    /// <summary>
    /// Class ChineseGreeting
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:02:56</remarks>
    public class ChineseGreeting : IGreetingStrategy
    {
        private string greetingType;
        public ChineseGreeting(string greetingType)
        {

            this.greetingType = greetingType;
        }
        public ChineseGreeting() : this("中文") { }
        public ChineseGreeting(XmlNode section) {
            XmlAttribute attr = section.SelectSingleNode("params").Attributes["greetingType"];//获取属性值
            greetingType = attr.Value;//为字段赋值
        }
        public string GreetingType
        {
            get { return greetingType; }
        }

        public void SetGreetingWords(ITextControl textContrl)
        {
            textContrl.Text = "你好啊,小读者!";
        }
    }

    /// <summary>
    /// Class GeneralClass:这个类可能还有很多的字段,属性,方法,这里只是简写下
    /// PS:GeneralClass是一个普通的类型,这个类内部维护着IGreetingStrategy,调用的时候还是根据多态具体调用。
    /// </summary>
    /// <remarks>Editor:v-liuhch CreateTime:2015/6/28 11:08:04</remarks>
    public class GeneralClass
    {
        private IGreetingStrategy gs;
        public GeneralClass(IGreetingStrategy gs)
        {
            this.gs = gs;
        }
        public string GeneralProperty
        {
            get
            {
                //做一些额外的工作,这里省略
                return "<span sytle=&#39;color:red&#39;>" + gs.GreetingType + "</span>";
            }
        }
        public void GeneralMethod(ITextControl textContrl)
        {
            //做一些额外的工作,这里省略
            gs.SetGreetingWords(textContrl);
            textContrl.Text = "<span sytle=&#39;color:red&#39;>" + textContrl.Text + "</span>";
            //省略。。。。。。。
        }


    }

}
登入後複製

#然後定義我們要使用特定類別的特定類別和自訂標籤的處理程序:

  <!--greetingStrategy节点及其处理程序配置-->
  <configSections>
    <section name="greetingStrategy" type="ClassLib.GreetingConfigurationHandler,ClassLib"/>
  </configSections>
  <greetingStrategy type="ClassLib.ChineseGreeting,ClassLib">
    <params greetingType="***中文问候***"/>  <!--构造函数的参数-->
  </greetingStrategy>
登入後複製

這裡,ChineseGreeting是我們要使用的類,上面定義的是處理greetingStrategy的類別;

# 接著,寫這個類別的具體實作:

namespace ClassLib
{
    public class GreetingConfigurationHandler : IConfigurationSectionHandler
    {
        /*
         处理有参数的构造函数的对象的创建:
         */
        /// <summary>
        /// 创建配置节处理程序。
        /// </summary>
        /// <param name="parent">父对象。</param>
        /// <param name="configContext">配置上下文对象。</param>
        /// <param name="section">节 XML 节点。</param>
        /// <returns>创建的节处理程序对象。</returns>
        /// <exception cref="System.NotImplementedException"></exception>
        /// <remarks>Editor:v-liuhch CreateTime:2015/6/30 20:34:54</remarks>
        public object Create(object parent, object configContext, System.Xml.XmlNode section)
        {
            //获取节点type属性的值
            Type t = Type.GetType(section.Attributes["type"].Value);
            object obj=null;

            try
            {
                /* 2,在要实例的类中加入一个构造函数,接收一个XmlNode节点,将greeting_stragetgy的节点在此传递,然后在这个构造函数中进行处理;*/
                //如果t包含有参数为xmlnode的构造函数,直接使用这个构造函数
                Type[] paras = { typeof(XmlNode) };
                ConstructorInfo constructors = t.GetConstructor(paras);
                if (constructors != null)
                {
                    object[] paramters = { section };
                    return Activator.CreateInstance(t, paramters); //传入读取到的构造函数的参数
                }

                if (section.SelectSingleNode("params") == null)  //无参数构造函数
                {
                    obj = Activator.CreateInstance(t);
                }
                else  //有参数构造函数
                {
                    /*1,在此类中对策略类进行处理,取得params节点的属性值,然后传递给具体实例化的类;*/

                    //获取params节点的属性greetingType的值
                    XmlAttribute attr = section.SelectSingleNode("params").Attributes["greetingType"];
                    object[] parameters = { attr.Value };
                    obj = Activator.CreateInstance(t, parameters); //传入读取到的构造函数的参数
                } 
            }
            catch (Exception)
            {

                return null;
            }
            
            return obj ;
        }
    }
}
登入後複製

          在創建方法中,我們先判斷ChineseGreeting類別有沒有一個參數為節點的建構方法,如果有的話,就直接將section當作參數,在利用反射創建型別實例的時候傳進去;

           如果沒有這樣的建構方法,我們就在這個處理類別裡面讀取XML檔案中的參數,然後在型別實例化的時候傳進去;

             以兩種方式進行比較,但其實都是一樣的,只過是這個參數讀取的早晚的問題;個人對比了下,覺得在這個類別裡面讀取配置文件中的構造函數參數的方式更加靈活,個人偏愛。

           寫東西測驗下:

 #region 自定义节点存储类型信息——反射方法
            IGreetingStrategy greetingStrategy = (IGreetingStrategy)ConfigurationManager.GetSection("greetingStrategy");
            if (greetingStrategy != null)
            {
                GeneralClass generalClass = new GeneralClass(greetingStrategy);
                ltrGreetingType.Text = generalClass.GeneralProperty;
                generalClass.GeneralMethod(ltrGreetingWord);
            }
            #endregion
登入後複製

         嘿嘿,較為方便。

        

        感覺反射強大在將變化抽出來,但是抽出來的這個變化放到哪裡去最容易維護成本較低,於是設定檔這時候就該上了。 。 。 。 。 。

 以上就是.Net設定檔-反射+設定檔儲存類型實例的內容,更多相關內容請關注PHP中文網(www.php.cn)!







#########
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中介面和抽象類別的反射機制實現 Java 中介面和抽象類別的反射機制實現 May 02, 2024 pm 05:18 PM

反射機制允許程式在執行時間取得和修改類別訊息,它可用於實作介面和抽象類別的反射:介面的反射:透過Class.forName()取得介面反射對象,存取其元資料(名稱、方法和欄位) 。抽象類別的反射:與介面類似,可取得抽象類別的反射對象,存取其元資料以及非抽象方法。實戰案例:反射機制可用於實作動態代理,透過動態建立代理類別在執行時攔截對介面方法的呼叫。

golang 如何使用反射存取私有欄位和方法 golang 如何使用反射存取私有欄位和方法 May 03, 2024 pm 12:15 PM

Go語言中可以使用反射來存取私有欄位和方法:存取私有欄位:透過reflect.ValueOf()取得值的反射值,再使用FieldByName()取得欄位的反射值,並呼叫String()方法列印欄位的值。呼叫私有方法:同樣透過reflect.ValueOf()取得值的反射值,再使用MethodByName()取得方法的反射值,最後呼叫Call()方法執行方法。實戰案例:透過反射修改私有欄位值和呼叫私有方法,實現物件的控制和單元測試覆寫。

win10使用者設定檔在哪? Win10設定使用者設定檔的方法 win10使用者設定檔在哪? Win10設定使用者設定檔的方法 Jun 25, 2024 pm 05:55 PM

最近有不少Win10系統的使用者想要更改使用者設定文件,但不清楚具體如何操作,本文將為大家帶來Win10系統設定使用者設定檔的操作方法吧! Win10如何設定使用者設定檔1、首先,按下「Win+I」鍵開啟設定介面,並點選進入「系統」設定。 2、接著,在打開的介面中,點擊左側的“關於”,再找到並點擊其中的“高級系統設定”。 3、然後,在彈出的視窗中,切換到「」選項欄,並點擊下方「用戶配

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

golang 反射的安全性考量和最佳方案 golang 反射的安全性考量和最佳方案 May 04, 2024 pm 04:48 PM

反射在Go中提供類型檢查和修改功能,但存在安全隱患,包括任意程式碼執行、類型偽造和資料外洩。最佳方案包括限制反射權限、操作、使用白名單或黑名單、驗證輸入以及使用安全工具。實務中,反射可安全用於檢查類型資訊。

在Ubuntu上安裝Helm 在Ubuntu上安裝Helm Mar 20, 2024 pm 06:41 PM

Helm是Kubernetes的一個重要元件,它透過將設定檔捆綁到一個稱為HelmChart的套件中來簡化Kubernetes應用程式的部署。這種方法使得更新單一設定檔比修改多個檔案更便捷。借助Helm,使用者可以輕鬆部署Kubernetes應用程序,簡化了整個部署過程,提高了效率。在本指南中,我將介紹在Ubuntu上實作Helm的不同方法。請注意:以下指南中的命令適用於Ubuntu22.04以及所有Ubuntu版本和基於Debian的發行版。這些命令經過測試,應該會在您的系統上正常運作。在U

golang 如何使用反射動態修改變數值 golang 如何使用反射動態修改變數值 May 02, 2024 am 11:09 AM

Go語言反射允許在運行時操控變數值,包括修改布林值、整數、浮點數和字串。透過取得變數的Value,可以呼叫SetBool、SetInt、SetFloat和SetString方法來進行修改。例如,可以解析JSON字串為結構體,然後使用反射修改結構體欄位的值。需要注意,反射操作較慢,且無法修改不可修改字段,修改結構體字段值時可能不會自動更新相關字段。

golang函數利用反射實現面向切面的編程 golang函數利用反射實現面向切面的編程 Apr 25, 2024 pm 05:48 PM

答案:是的,Go語言中的反射可以實現面向切面的程式設計。詳細描述:反射允許程式在運行時修改和檢查自己的類型和值。透過反射,我們可以為程式碼創建全域切面,在函數執行前、後觸發。這使我們能夠輕鬆新增日誌記錄等功能,而無需修改現有程式碼。反射提供了程式碼解耦、可擴展性以及靈活控制的優點,從而提高了應用程式的可維護性和可重用性。

See all articles