C#通過字元串名稱來調用對應字元串名稱的方法

来源:https://www.cnblogs.com/yzw1298023866/archive/2019/03/31/10632434.html
-Advertisement-
Play Games

前段時間在一個項目中,在一個地方要將函數所在類中的方法都調用一遍,但是否調用要通過配置文件中的內容決定。所以為了減少代碼量,在網上查了相關信息,終於成功的將其應用到了項目中,我在這裡將我做的一個簡單例子提供給大家,便於大家方便下載和理解。 主要用到了反射的一個特性,主要代碼如下: 基本步驟就是: 1 ...


前段時間在一個項目中,在一個地方要將函數所在類中的方法都調用一遍,但是否調用要通過配置文件中的內容決定。所以為了減少代碼量,在網上查了相關信息,終於成功的將其應用到了項目中,我在這裡將我做的一個簡單例子提供給大家,便於大家方便下載和理解。

主要用到了反射的一個特性,主要代碼如下:

object[] _params = new object[kvp.Value.Length]; 
for (int i = 0; i <= _params.Length - 1; i++)
{
_params[i] = kvp.Value[i]; 
}

Type t = typeof(ListOfWay); 
MethodInfo mi = t.GetMethod(kvp.Key.ToString()); 
object objinstance = Activator.CreateInstance(t); 
int result = (int)mi.Invoke(objinstance, _params);

基本步驟就是:

1、將要調用的方法的參數全部依次放入一個object數組中;

2、用反射一個特性,獲得方法所在類的類型;

3、根據對象和方法參數去調用這個方法。

 詳細代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Reflection;

using TestWay;

namespace 載入xml及調用字元串名的函數
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string[]> dict = new Dictionary<string, string[]>();
            string path = @"InputParam.xml";

            ReadXml(path, dict);

            foreach (KeyValuePair<string, string[]> kvp in dict)
            {

                #region 根據字元串去調用與字元串相同名稱的方法
                object[] _params = new object[kvp.Value.Length];  //根據鍵值對中值的多少聲明一個同樣大小的字元串數組
                for (int i = 0; i <= _params.Length - 1; i++)
                {
                    _params[i] = kvp.Value[i];       //將鍵值對中的值寫入數組中
                }

                Type t = typeof(ListOfWay);           //獲得方法所在的類的類型
                MethodInfo mi = t.GetMethod(kvp.Key.ToString());       //根據字元串名稱獲得對應的方法
                object objinstance = Activator.CreateInstance(t);      //創建一個方法所在的類的一個對象
                int result = (int)mi.Invoke(objinstance, _params);     //根據對象和方法參數去執行方法
                #endregion

                Console.WriteLine(result);
            }

            Console.ReadLine();
        }

        #region Way2
        /// <summary>
        /// 讀取XML文檔
        /// </summary>
        /// <param name="path">xml路徑(含名稱)</param>
        /// <param name="dict">xml中參數字典</param>

        public static void ReadXml(string path, Dictionary<string, string[]> dict)
        {
            XmlDocument xml = new XmlDocument();
            xml.Load(path);
            XmlElement xmlRoot = xml.DocumentElement;      //根節點
            XmlNodeList xmllist = xmlRoot.ChildNodes;      //根節點下所有子節點(一般是二級節點)
            foreach (XmlNode item in xmllist)
            {
                XmlNodeList inxmllist = item.ChildNodes;   //每個子節點下的所有子節點(一般是三級節點,也基本是最內層節點)
                string[] param = new string[inxmllist.Count];
                for (int i = 0; i <= inxmllist.Count - 1; i++)
                {
                    param[i] = inxmllist[i].InnerText;     //將每個子節點的值放入數組
                }
                dict.Add(item.Name, param);
            }
        }
        #endregion

    }
}
View Code

用於測試的方法所在的類的代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestWay
{
    public class ListOfWay
    {
        public int Add(string a, string b)
        {
            return Convert.ToInt32(a) + Convert.ToInt32(b);
        }
        public int Sub(string a, string b)
        {
            return Convert.ToInt32(a) - Convert.ToInt32(b);
        }
        public int Mul(string a, string b)
        {
            return Convert.ToInt32(a) * Convert.ToInt32(b);
        }
        public int Div(string a, string b)
        {
            return Convert.ToInt32(a) / Convert.ToInt32(b);
        }

    }
}
View Code

 


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

-Advertisement-
Play Games
更多相關文章
  • 本文用第三方類庫:yagmail 實現;以QQ郵箱作為發送郵箱為例。最終的實現效果:給指定郵箱,發送指定內容的郵件。 準備工作 1、用於發送郵件的賬號信息 比如賬號用自己的qq郵箱,但'密碼'需要在郵箱:設置--賬戶--開啟POP3/SMTP服務,開啟後會獲得授權碼(把它理解為'密碼'就行~)。 2 ...
  • 本篇博文主要記錄Python的Debug方法:print()、logging、ipdb ...
  • 資料庫連接字元串(web.config來配置),可以動態更改connectionString支持多資料庫. SqlServer調用資料庫 using System; using System.Collections.Generic; using System.Linq; using System.T ...
  • 隨著.NET Core 在 Linux 下的熱動,相信動不動就要分散式或集群的應用的需求,會慢慢火起來。所以這段時間一直在研究和思考分散式集群的問題,同時也在思考把幾個框架的思維相對提升到這個Level。最近大力重構了框架兩個點:一個是分散式緩存,一個是資料庫主從備。 今天,先分享分散式緩存的改進的... ...
  • 早就聽說ASP.NET Core 3.0中引入了gRPC的服務模板,正好趁著家裡電腦剛做了新系統,然後裝了VS2019的功夫來體驗一把。同時記錄體驗的過程。如果你也想按照本文的步驟體驗的話,那你得先安裝.NET Core3.0預覽版的SDK。至於開發工具我用的時VS2019,當然你也可以使用VS C ...
  • 通過對地鐵運行圖的研究,我們決定將所有線路先行錄入資料庫,並決定採用迪傑斯特拉演算法實現最短路徑的查詢,對於迪傑斯特拉演算法我們並不陌生,在上學期的數據結構課程中我們學習並反覆訓練了很久關於這個演算法的具體實驗,有豐富的理論基礎和一定的操作基礎,當前最大的問題就在與對資料庫內容進行增刪改查以及鏈接頁面實現 ...
  • 在Windows Server2012版本的伺服器系統中,我們可以通過伺服器管理器中的"添加角色和功能"來添加IIS的Web伺服器,當我們不再使用IIS功能時候,我們也可以通過刪除角色和功能來刪除Web伺服器(IIS)並移除相關依賴項。 (1)遠程連接上windows伺服器,然後進入打開伺服器管理器 ...
  • .NET MVC全局異常處理(二) [TOC] 對上節的內容進行了補充 MVC過濾器Filter MVC有四種過濾器:Authorization、Exception、Action、Result,我們要用的的就是Exception異常過濾器 當我們新建一個MVC項目後,異常過濾器就已經自動在程式中註冊 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...