ここで私の最近の回答を参照してください: Parsing "DateTime.Now"?
基本的に、 FLEEなどの既存のライブラリを簡単に活用して、式を解析し、これらのルールの IL を出力できます。例を見ると、利用するユーザー式の変数を設定する方法がわかります。たとえば、いくつかの入力変数 (HireDate
または などEnrollmentDate
) と、日付を返すユーザー式/述語で構成される「ルール」を定義できます。リンクされた回答にあるようなメンバーを公開するDateTime
と、ユーザーはそれらも活用できます。
簡単な例として、テストされていませんが、アイデアが得られるはずです。
月の最初の日を取得するなど、いくつかのカスタム関数をセットアップして役立てることができます。
public static class CustomFunctions
{
public static DateTime GetFirstDayOfMonth(DateTime date)
{
return new DateTime(date.Year, date.Month, 1);
}
}
基本的な FLEE セットアップ (必要に応じてカスタマイズ/微調整する必要があります)
ExpressionContext context = new ExpressionContext();
//Tell FLEE to expect a DateTime result; if the expression evaluates otherwise,
//throws an ExpressionCompileException when compiling the expression
context.Options.ResultType = typeof(DateTime);
//Instruct FLEE to expose the `DateTime` static members and have
//them accessible via "DateTime".
//This mimics the same exact C# syntax to access `DateTime.Now`
context.Imports.AddType(typeof(DateTime), "DateTime");
context.Imports.AddType(typeof(CustomFunctions));
//Expose your key variables like HireDate and EnrollmentDate
context.Variables["HireDate"] = GetHireDate(); //DateTime I suppose
context.Variables["EnrollmentDate"] = GetEnrollmentDate(); //DateTime I suppose
//Parse the expression, naturally the string would come from your data source
IGenericExpression<DateTime> expression = context.CompileGeneric<DateTime>(GetYourRule(), context);
DateTime date = expression.Evaluate();
次に、ルールは次のようになります。
string rule1 = "if(HireDate > EnrollmentDate, HireDate, EnrollmentDate)";
string rule2 = "HireDate.AddDays(90)";
string rule3 = "GetFirstDayOfMonth(EnrollmentDate.AddMonths(1))";
string rule4 = "GetFirstDayOfMonth(EnrollmentDate.AddMonths(if(EnrollmentDate.Day < 15, 1, 2)))";