C#で動的コード実行!ExpressionEvaluatorライブラリを徹底解説
C#アプリケーションに、設定ファイルやユーザー入力から動的に数式評価やロジック実行機能を組み込みたいと思ったことはありませんか?本記事では、強力なC#ライブラリ「ExpressionEvaluator」について、その基本から応用まで、具体的なコード例を交えて詳しく解説します。
ExpressionEvaluatorとは?
ExpressionEvaluatorは、C#で作成されたオープンソースのライブラリです。その主な機能は、文字列として与えられた数式やC#のコードを動的に評価し、実行することです。
通常、C#のコードはコンパイル時に静的に解釈され、実行可能ファイルが作成されます。しかし、アプリケーションの実行中にユーザーが入力した数式を計算したり、設定ファイルに記述されたビジネスルールを適用したりしたい場合があります。このような「動的な」要求に応えるのがExpressionEvaluatorの役割です。
このライブラリを利用することで、アプリケーションのロジックの一部を外部の文字列として定義し、それを実行時に解釈・実行するという、非常に柔軟なシステムを構築することが可能になります。
なぜExpressionEvaluatorが必要なのか?
アプリケーションを開発する上で、ロジックの一部を柔軟に変更したいという場面は少なくありません。例えば、以下のようなケースが考えられます。
- ユーザーが独自の計算式を定義できる電卓アプリ
- 割引率やポイント計算のルールを、プログラムを再コンパイルせずに変更できるECサイト
- ゲームのキャラクターの能力値を、外部ファイルで調整できるようにしたい
- 複雑なレポートの集計ロジックを、データベースに保存しておきたい
これらの要件をゼロから実装しようとすると、文字列を解析するパーサーを自作する必要があり、非常に複雑で多くの工数を要します。ExpressionEvaluatorは、この最も困難な「文字列の解析と実行」部分を肩代わりしてくれる強力なツールです。
主な機能
ExpressionEvaluatorは非常に多機能ですが、ここではその中でも特に重要な機能をいくつか紹介します。
1. 基本的な数式評価
最も基本的な機能は、四則演算や括弧を含む数式の評価です。
// "1 + 2 * (3 + 4)" のような文字列を計算します
int result = ExpressionEvaluator.Evaluate<int>("1 + 2 * (3 + 4)");
// 結果は 15 になります
2. 変数の利用
式の中で変数を扱うことができます。これにより、動的な値を計算に含めることが可能になります。
var evaluator = new ExpressionEvaluator();
evaluator.Variables["x"] = 10;
evaluator.Variables["y"] = 20;
// "x * y + 5" を計算します
int result = evaluator.Evaluate<int>("x * y + 5");
// 結果は 205 (10 * 20 + 5) になります
3. C#のメソッドやプロパティへのアクセス
既存の.NETクラスのメソッドを呼び出したり、プロパティにアクセスしたりすることもできます。
// Mathクラスの静的メソッドを呼び出す
double result = ExpressionEvaluator.Evaluate<double>("Math.Pow(2, 10)");
// 結果は 1024.0 になります
// 文字列オブジェクトのプロパティにアクセスする
var evaluator = new ExpressionEvaluator();
evaluator.Variables["myString"] = "hello world";
int length = evaluator.Evaluate<int>("myString.Length");
// 結果は 11 になります
4. LINQのサポート
ExpressionEvaluatorはLINQ構文もサポートしており、コレクションデータに対する複雑なクエリを文字列として実行できます。
var evaluator = new ExpressionEvaluator();
var list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
evaluator.Variables["numbers"] = list;
// LINQを使って偶数のみを抽出し、合計を計算する
string expression = "numbers.Where(n => n % 2 == 0).Sum()";
int result = evaluator.Evaluate<int>(expression);
// 結果は 30 (2 + 4 + 6 + 8 + 10) になります
5. カスタム関数と演算子の定義
アプリケーション独自の関数や演算子を定義して、式の中で利用することも可能です。これにより、ドメイン固有のロジックをより自然な形で表現できます。
ExpressionEvaluatorのインストール方法
ExpressionEvaluatorはNuGetパッケージマネージャーを通じて簡単にインストールできます。
パッケージマネージャーコンソールを利用する場合:
Install-Package ExpressionEvaluator
.NET CLIを利用する場合:
dotnet add package ExpressionEvaluator
実用的なシナリオ例:動的ビジネスルールエンジン
ExpressionEvaluatorの強力な活用例として、ビジネスルールエンジンを構築するシナリオを考えてみましょう。
例えば、ECサイトの注文金額に応じて送料を決定するロジックを考えます。このルールは、キャンペーンや配送業者の料金改定などによって頻繁に変更される可能性があります。
ルール:
- 注文金額が5,000円未満の場合、送料は500円
- 注文金額が5,000円以上10,000円未満の場合、送料は250円
- 注文金額が10,000円以上の場合、送料は無料
このロジックを、プログラム内にハードコーディングするのではなく、ExpressionEvaluatorを使って動的に評価してみましょう。
using System;
using codingseb.ExpressionEvaluator;
public class ShippingFeeCalculator
{
private readonly ExpressionEvaluator evaluator;
public ShippingFeeCalculator()
{
evaluator = new ExpressionEvaluator();
}
public decimal Calculate(decimal orderAmount)
{
// 本来、このルール文字列はデータベースや設定ファイルから読み込みます
string rule = "orderAmount < 5000 ? 500 : (orderAmount < 10000 ? 250 : 0)";
evaluator.Variables["orderAmount"] = orderAmount;
return evaluator.Evaluate<decimal>(rule);
}
}
// ---- 実行コード ----
var calculator = new ShippingFeeCalculator();
// 注文金額が3,000円の場合
decimal fee1 = calculator.Calculate(3000m);
// fee1 は 500 になります
// 注文金額が7,000円の場合
decimal fee2 = calculator.Calculate(7000m);
// fee2 は 250 になります
// 注文金額が12,000円の場合
decimal fee3 = calculator.Calculate(12000m);
// fee3 は 0 になります
この例では、送料計算のロジック(三項演算子で表現)を文字列として保持しています。もし送料体系が変更になった場合でも、プログラム本体を修正・再コンパイルすることなく、このルール文字列を変更するだけで対応が完了します。これにより、システムの保守性と柔軟性が大幅に向上します。
セキュリティに関する注意点
ExpressionEvaluatorは、文字列からC#コードを動的に実行できるため、非常に強力であると同時に、セキュリティ上のリスクも伴います。特に、ユーザーが入力した文字列を直接評価するような場合には注意が必要です。
悪意のあるユーザーが、システムファイルを削除したり、データベースに不正なアクセスを試みるようなコード(例:System.IO.File.Delete("C:\\important.txt")
)を入力する可能性があります。
このようなリスクを軽減するため、ExpressionEvaluatorには特定の型や名前空間へのアクセスを制限する機能が備わっています。信頼できないソースからの文字列を評価する場合は、必ずこれらのセキュリティ機能を活用し、実行可能な操作を厳密に制限することが不可欠です。
まとめ
ExpressionEvaluatorは、C#アプリケーションに動的な数式評価やロジック実行の機能を追加するための、非常にパワフルで柔軟なライブラリです。基本的な計算から、変数の利用、.NETメソッドの呼び出し、LINQクエリの実行まで、幅広いニーズに対応します。
ビジネスルールの動的な管理、カスタマイズ可能な計算機能、アプリケーション内スクリプティングなど、その応用範囲は多岐にわたります。
柔軟なシステム設計を可能にする一方で、動的コード実行に伴うセキュリティリスクも理解し、適切に対策を講じることが重要です。このライブラリを正しく活用することで、あなたのC#アプリケーションの可能性を大きく広げることができるでしょう。
お仕事のご依頼・ご相談はこちら
フロントエンドからバックエンドまで、アプリケーション開発のご相談を承っております。
まずはお気軽にご連絡ください。
関連する記事
geometry3Sharpとは?C#で使える強力な3Dジオメトリ計算ライブラリを徹底解説
C#で3Dメッシュ処理や幾何計算を行いたい開発者必見!オープンソースライブラリ「geometry3Sharp」の機能、特徴、使い方、活用例をわかりやすく解説します。ゲーム開発、CAD、3Dプリンティング分野で役立ちます。
BootSharpとは?.NETをJavaScript環境で動かす新定番!使い方やBlazorとの違いを解説
BootSharpを使えば、C#で書いたコードをWebAssemblyを介してブラウザなどのJavaScript環境で簡単に実行できます。この記事では、BootSharpの基本的な使い方、Blazorとの違い、具体的な活用例を初心者にも分かりやすく解説します。UIフレームワークに縛られず、.NETのパワーをWebで活かしたい開発者必見です。
C++ Armadilloライブラリ徹底解説:インストールから実践的使い方まで
C++で高度な線形代数計算を簡単かつ高速に行いたいですか?この記事では、強力なC++ライブラリ「Armadillo」のインストール方法から、行列やベクトルの基本的な操作、連立一次方程式の解法、統計計算といった実践的な使い方まで、豊富なコード例と共に詳しく解説します。科学技術計算や機械学習の実装に役立つ知識を身につけましょう。
C++ Eigenライブラリ入門:行列・ベクトル計算を高速かつ直感的に
Eigenは、C++で高度な線形代数計算を可能にする強力なテンプレートライブラリです。この記事では、Eigenの基本的な使い方から、行列やベクトルの操作、連立一次方程式の解法、さらには応用例まで、初心者にも分かりやすく丁寧に解説します。ロボティクス、3Dグラフィックス、機械学習などの分野で必須となる行列計算を、Eigenで効率的に行いましょう。
Google Cloudとは?主要サービスやメリットを初心者にもわかりやすく徹底解説
「Google Cloud(GCP)って何?」「何ができるの?」そんな疑問を解決します。この記事では、Google Cloudの基本的な概念から、主要なサービス、具体的なメリット、料金体系、そして始め方まで、初心者の方にも理解しやすいように丁寧に解説。ビジネスや開発にクラウドを活用したいと考えている方は必見です。