私はFleeライブラリを使用して、ユーザーが入力する式を評価しています。私は、式がコンパイルされず、ユーザーに無効な入力を警告するという事実を使用しています。文字列とオブジェクトの比較を無効にする
var == "something"のような式を使用すると、これは有効なコードではないため、varがintの場合はコンパイルされません。
varが私が作ったカスタムクラスのオブジェクトである場合(オブジェクトは私が推測するToStringメソッドを持っているので)コンパイルします。そこに含まれている変数を文字列と比較できない場合、カスタムクラスの式がコンパイルされないようにするにはどうすればよいですか?
更新:ここに問題を示すコード例があります。メッセージをコンパイルしようとしたときにフィルタ1は、エラーがスローされます:
Ciloci.Flee.ExpressionCompileException:CompareElement:動作「イコールは」種類「のInt32」と「文字列」
しかし、第二のフィルタ用に定義されていないこと整数の代わりに変数型としてカスタムクラスを使用しても例外は発生しません。しかし、私はそのカスタムクラスがintのように振る舞い、Equalオペレーションが定義されていないようにしたい。どうやってするか?
using System;
using Ciloci.Flee;
namespace FleeTest
{
class VariableClass
{
// TODO
}
class Program
{
public static void Main(string[] args)
{
ExpressionContext context = new ExpressionContext();
context.Options.ResultType = typeof(bool);
VariableCollection var = context.Variables;
var.ResolveVariableType += var_ResolveVariableType;
string filter1 = "varInt=\"something\"";
string filter2 = "varClass=\"something\"";
try
{
IDynamicExpression e = context.CompileDynamic(filter1);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
try
{
IDynamicExpression e = context.CompileDynamic(filter2);
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
}
static void var_ResolveVariableType(object sender, ResolveVariableTypeEventArgs e)
{
if(e.VariableName == "varInt")
{
e.VariableType = typeof(int);
}
else if(e.VariableName == "varClass")
{
e.VariableType = typeof(VariableClass);
}
}
}
}
使用している実際のコードを教えてください。 –
比較の前に変数の型をチェックしてください。 – Mox
あなたが 'ToString()'のためだと思うなら、それを上書きしてエラーを投げることができます。それが動作するかどうかを確認します。 – Emad