DynamicExpression.ParseLambdaを使用してLambdaExpressionツリーを解析しようとしていますが、StringComparison列挙型でstring.Equalsを使用すると、正しく解析できません。
私が試してみました:
a)StringComparisonを使用していますが、「不明な識別子 'StringComparison」というエラーが表示されます。
b)System.StringComparisonの完全な名前空間を使用していますが、「不明な識別子「システム」というエラーが発生します。
[TestMethod()]
public void CanParseStringEqualsWithEnum()
{
var input = @"p0.Equals(""Testing"", StringComparison.InvariantCultureIgnoreCase)";
var p0 = Expression.Parameter(typeof(string), "p0");
System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p0 }, typeof(bool), input);
}
StringComparisonの削除は機能します。
[TestMethod()]
public void CanParseStringEqualsWithEnum()
{
var input = @"p0.Equals(""Testing"")";
var p0 = Expression.Parameter(typeof(string), "p0");
System.Linq.Dynamic.DynamicExpression.ParseLambda(new[] { p0 }, typeof(bool), input);
}
両方の文字列で.ToUpper()を実行してその方法を比較することもできますが、これはすべてのシナリオをカバーしているわけではなく、StringComparisonを使用する方がよいことはわかっています。
(コード変更を含まない)別のソリューションは、列挙に値3を使用することです。
System.Linq.Dynamic.Coreを使用すると、次のコードが機能します。
var input = @"p0.Equals(""Testing"", 3)";
var p0 = Expression.Parameter(typeof(string), "p0");
var expression = DynamicExpressionParser.ParseLambda(new[] { p0 }, typeof(bool), input);
Delegate del = expression.Compile();
var result = del.DynamicInvoke("testing") as bool?;
更新
System.Linq.Dynamic.Core (バージョン1.0.16)のコードを変更しました。これで、次のものを使用することもできます。
var input = @"p0.Equals(""Testing"", StringComparison.InvariantCultureIgnoreCase)";
// ...
この答えを見つけ 、System.Linq.Dynamicライブラリのソースにパッチを適用しました。 GitHubからパッケージソースをダウンロードし、System.StringComparisonをSystem.ExpressionParser内のタイプの「predefinedTypes」配列に追加しました。
更新 :より良い解決策については、Stefの回答を参照してください: https : //stackoverflow.com/a/56472200/785965