系列文章
【C#】編號生成器(定義單號規(guī)則、固定字符、流水號、業(yè)務(wù)單號)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129129787
【C#】日期范圍生成器(開始日期、結(jié)束日期)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129040663
【C#】組件化開發(fā),調(diào)用dll組件方法
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129492112
【C#】數(shù)據(jù)實(shí)體類使用
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/128816638
【C#】單據(jù)審批流方案
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/128972545
【C#】條碼管理操作手冊
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/126589496
【C#】IIS平臺下,WebAPI發(fā)布及異常處理
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/126539836
【C#】代碼模板生成工具
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/126890673
【C#】MySQL數(shù)據(jù)庫導(dǎo)入工具(批量Excel插入)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/126427323
【C#】簡單二維碼制作和打印工具
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/126884228
【C#】最全單據(jù)打印(打印模板、條形碼&二維碼、字體樣式、項(xiàng)目源碼)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129415723
【C#】Windows服務(wù)(Service)安裝及啟停方案
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/124053794
【C#】穿透Session隔離,服務(wù)調(diào)用外部程序(無窗體界面解決)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/124053033
【C#】任務(wù)計(jì)劃實(shí)現(xiàn),使用Quartz類
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/123667723
【C#】源碼解析正則表達(dá)式
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/118337074
【C#】軟件版本和文件MD5記錄(XML操作)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/112513871
【C#】測試網(wǎng)絡(luò)是否連通
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/110137288
【C#】根據(jù)名稱獲取編碼(Dictionary獲取key方法)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129816701
【C#】數(shù)據(jù)建模,你是使用DataTable還是List?
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129792726
【C#】GridControl控件和數(shù)據(jù)集雙向綁定
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/129423755
【C#】GridControl動態(tài)更換DataSource,數(shù)據(jù)查詢異常處理
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/130305424
【C#】GridControl日期字段顯示時(shí)分秒
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/130718303
【C#】GridControl增加選擇列(不用二次點(diǎn)擊)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/130763713
【C#】數(shù)據(jù)庫檢查工具(可跨庫訪問)
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/97172329
【C#】代碼解析–打印數(shù)據(jù)集
本文鏈接:https://blog.csdn.net/youcheng_ge/article/details/131431829
前言
我能抽象出整個(gè)世界,但是我不能抽象你。 想讓你成為私有常量,這樣外部函數(shù)就無法訪問你。 又想讓你成為全局常量,這樣在我的整個(gè)生命周期都可以調(diào)用你。 可惜世上沒有這樣的常量,我也無法定義你,因?yàn)槟阍谖倚闹惺悄敲吹木唧w。
哈嘍大家好,本專欄為【項(xiàng)目實(shí)戰(zhàn)】專欄,有別于【底層庫】專欄,我們可以發(fā)現(xiàn)增加 了『問題描述』、『項(xiàng)目展示』章節(jié),十分符合項(xiàng)目開發(fā)流程,讓讀者更加清楚項(xiàng)目解決的問題、以及產(chǎn)品能夠達(dá)到的效果。本專欄收納項(xiàng)目開發(fā)過程的解決方案,是我項(xiàng)目開發(fā)相對成熟、可靠方法的提煉,我將這些問題的解決思路梳理,撰寫本文分享給大家,大家遇到類似問題,可按本文方案處理。
本專欄會持續(xù)更新,不斷完善,專欄文章關(guān)聯(lián)性較弱(文章之間依賴性較弱,沒有閱讀順序)。大家有任何問題,可以私信我。如果您對本專欄感興趣,歡迎關(guān)注吧,我將帶你用最簡潔的代碼,實(shí)現(xiàn)復(fù)雜的功能。
·提示:本專欄為項(xiàng)目實(shí)戰(zhàn)篇,未接觸項(xiàng)目開發(fā)的同學(xué)可能理解困難,不推薦閱讀。
一、問題描述
今天遇到一個(gè)棘手問題,要排查出某個(gè)項(xiàng)目代碼中,所有Const單元中,所有常量定義和值,如下圖所示:
??
二、解決方案
首先想到兩個(gè)方案:
①直接按行讀取源代碼,檢查 public const 后面的字符串進(jìn)行代碼行(以分號結(jié)尾為一行代碼)分割處理。
②采用“正則表達(dá)式”,分別匹配到“ct_”、“【SQL語句】”常量定義。
兩種方法其實(shí)大同小異,理論上可行,但是實(shí)際情況,開發(fā)人員“編碼尚不規(guī)范”,給排查算法增添幾分復(fù)雜度。比方說,SQL常量可能會換行、SQL常量還可能會拼接、有些常量中就會存在代碼結(jié)束符(;)等等問題。
最終,采用反射機(jī)制
,動態(tài)加載類文件。
三、軟件開發(fā)(源碼)
3.1 引入命名空間
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.IO;
using System.Reflection;
3.2 主方法
public static void Main(string[] args)
{
// 1.CSharpCodePrivoder
CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();
// 2.ICodeComplier
ICodeCompiler objICodeCompiler = objCSharpCodePrivoder.CreateCompiler();
// 3.CompilerParameters
CompilerParameters objCompilerParameters = new CompilerParameters();
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
// 4.CompilerResults
string l_strText = File.ReadAllText(@"D:\我的文檔\SharpDevelop Projects\fff\Const.cs");
CompilerResults cr = objICodeCompiler.CompileAssemblyFromSource(objCompilerParameters, l_strText);
if (cr.Errors.HasErrors)
{
Console.WriteLine("編譯錯(cuò)誤:");
foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
}
else
{
//5、CompiledAssembly
Assembly objAssembly = cr.CompiledAssembly;
Type t = objAssembly.GetType("Wesun.SW.M2012.Presentation.F201206.Const");
FieldInfo[] fis = t.GetFields(); // 注意,這里不能有任何選項(xiàng),否則將無法獲取到const常量
foreach (var fieldInfo in fis)
{
Console.WriteLine(fieldInfo.Name + "=" + fieldInfo.GetRawConstantValue().ToString());
}
}
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
3.3 常量單元
測試的類文件,利用反射讀取變量。
public static class Const
{
public const string ct_StrPackMode ="select * from T200_product_pack_mode where (1=1) and product_no = ";
public const string ct_FetchCustomer = "select * from V201_sale_order_receiver_F201208 where (1=1)";
public const string ct_FetchProductProduceLine = "select * from TA05_product_produce_product where product_no={0} and sys_no = {1} and default_tag = 'T'" ;
public const string ct_fetchSimpleCode="select '' as request_field4 ,'' as request_field4_name_cn union all Select simple_no as request_field4, simple_name_cn as request_field4_name_cn "
+"From T200_simple_code where (1=1) AND (simple_type= 'RF4');";
public const string ct_FetchRequestField = "select * from V200_product_code_default where (1=1) ";
}
四、項(xiàng)目展示
文章來源:http://www.zghlxwxcb.cn/news/detail-508167.html
五、資源鏈接
本文于2020-08-21 17:47:56首次發(fā)布,現(xiàn)采用 MD編譯
,重新排版整理。文章來源地址http://www.zghlxwxcb.cn/news/detail-508167.html
到了這里,關(guān)于【C#】反射機(jī)制,動態(tài)加載類文件的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!