[C#] リフレクション メカニズム、クラス ファイルを動的にロードする

一連の記事

[C#] ナンバー ジェネレーター (注文番号ルール、固定文字、シリアル番号、業務注文番号の定義)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/129129787

[C#] 日付範囲ジェネレーター (開始日、終了日)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/129040663

[C#] コンポーネントベースの開発、dll コンポーネント メソッドの呼び出し
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/129492112

[C#] データ エンティティ クラスの使用
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/128816638

[C#] ドキュメント承認フロー スキーム
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/128972545

[C#] バーコード管理操作マニュアル
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/126589496

[C#] IIS プラットフォームでの WebAPI 公開と例外処理
: https://blog.csdn.net/youcheng_ge/article/details/126539836

[C#] コード テンプレート生成ツール
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/126890673

[C#] MySQL データベース インポート ツール (Excel のバッチ挿入)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/126427323

【C#】簡単QRコード作成・印刷ツール
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/126884228

[C#] 最も完全なドキュメント印刷 (印刷テンプレート、バーコードと QR コード、フォント スタイル、プロジェクト ソース コード)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/129415723

[C#] Windows サービス (Service) のインストールと起動停止ソリューション
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/124053794

[C#] セッション分離の浸透、サービス呼び出し外部プログラム (フォーム インターフェイス ソリューションなし)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/124053033

[C#] Quartz クラスを使用したタスク プランの実装
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/123667723

[C#] ソース コードの正規表現の解析
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/118337074

[C#] ソフトウェア バージョンとファイル MD5 レコード (XML 操作)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/112513871

[C#] ネットワークが接続されているかどうかをテストする
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/110137288

【C#】名前に従ってコードを取得する(辞書取得キーメソッド)
この記事へのリンク:https ://blog.csdn.net/youcheng_ge/article/details/129816701

[C#] データモデリング、DataTable または List を使用しますか?
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/129792726


[C#] GridControl コントロールとデータセット間の双方向バインディング

[C#] GridControl による DataSource の動的置換、データ クエリ例外処理
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/130305424

[C#] GridControl の日付フィールドに時間、分、秒が表示される
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/130718303

[C#] GridControl は選択列を追加します (2 回目のクリックは必要ありません)
リンクをこの記事に追加します: https://blog.csdn.net/youcheng_ge/article/details/130763713

[C#] データベース チェック ツール (クロスライブラリ アクセス)
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/97172329

[C#] コード分析 – 印刷データセット
この記事へのリンク: https://blog.csdn.net/youcheng_ge/article/details/131431829



序文

私は世界全体を抽象化できますが、あなたを抽象化することはできません。あなたをプライベート定数にして、外部関数があなたにアクセスできないようにしたいと考えています。また、私はあなたに、生涯を通じてあなたに電話できるように、世界的な不変者になってほしいと思っています。世界にそのような一定のものが存在しないのは残念です、そしてあなたは私の心の中で非常に具体的であるため、私はあなたを定義することができません。

皆さん、こんにちは。このコラムは [プロジェクトの実戦] コラムであり、[基礎となるライブラリ] コラムとは異なります。「問題の説明」と「プロジェクトの表示」の章が追加されていることがわかります。プロジェクトの開発プロセスを示し、読者がプロジェクト、解決すべき問題、製品が達成できる効果をより明確に理解できるようにします。このコラムには、プロジェクト開発プロセスの解決策が含まれています。これは、私のプロジェクト開発のための比較的成熟した信頼できる手法を改良したものです。これらの問題の解決策を整理し、皆さんと共有するためにこの記事を書きます。同様の問題が発生した場合は、次のことができます。この記事の解決策に従って対処してください。

このコラムは今後も更新および改善されていく予定ですが、コラム記事間の関連性は弱いです (記事間の依存関係が弱く、読む順序はありません)。ご質問がございましたら、プライベートメッセージをお送りください。このコラムに興味がある方は、ぜひ注目してください。最も簡潔なコードを使用して複雑な関数を実現する方法を説明します。

·提示:本专栏为项目实战篇,未接触项目开发的同学可能理解困难,不推荐阅读。
3A0N000001


1. 問題の説明

今日、次の図に示すように、特定のプロジェクト コード内のすべての Const ユニットのすべての定数定義と値を見つけるという難しい問題に遭遇しました
ここに画像の説明を挿入
ここに画像の説明を挿入

2、解決策

まず、解決策としては 2 つが思いつきます。
①ソースコードを 1 行ずつ直接読み込んで public const 以降の文字列を確認し、コード行(セミコロンで終わるコード行)を分割する。
②「ct_」と「[SQL文]」の定数定義をそれぞれ「正規表現」で一致させます。
実際、この 2 つの方法は似ており、理論的には実現可能ですが、実際には、開発者の「コーディングがまだ標準化されていない」ため、トラブルシューティング アルゴリズムが少し複雑になります。たとえば、SQL 定数がラップされたり、SQL 定数が結合されたり、一部の定数にコード ターミネータ (;) などが含まれる場合があります。
ここに画像の説明を挿入
最後に、反射机制クラスファイルを動的にロードするを採用します。

3. ソフトウェア開発(ソースコード)

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("编译错误:");
                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();  // 注意,这里不能有任何选项,否则将无法获取到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) ";
}

4. プロジェクト表示

ここに画像の説明を挿入
ここに画像の説明を挿入

5. リソースリンク

この記事は 2020-08-21 17:47:56 に初めて公開され、現在採用MD编译および再構成されています。

Supongo que te gusta

Origin blog.csdn.net/youcheng_ge/article/details/131435110
Recomendado
Clasificación