次のような文字列があるとします。
string s1 = "a < 5";
string s2 = "b >= 7";
string s3 = "c <= 8";
...
このような文字列を BinaryExpression オブジェクトに変換して、以下を使用して得られるものと同様にしたいと考えています。
BinaryExpression b1 = Expression.MakeBinary( ExpressionType.LessThan, Expression.Parameter( typeof( int ), "a" ), Expression.Constant( 5, typeof( int ) ) );
BinaryExpression b2 = Expression.MakeBinary( ExpressionType.GreaterThanOrEqual, Expression.Parameter( typeof( int ), "b" ), Expression.Constant( 7, typeof( int ) ) );
BinaryExpression b3 = Expression.MakeBinary( ExpressionType.LessThanOrEqual, Expression.Parameter( typeof( int ), "c" ), Expression.Constant( 8, typeof( int ) ) );
以下のメソッドを作成しました。
BinaryExpression ConvertStringToBinaryExpression( string exp )
{
string[] s = exp.Split( ' ' );
string param = s[ 0 ];
string comparison = s[ 1 ];
int constant = int.Parse( s[ 2 ] );
if ( comparison == "<" )
return Expression.MakeBinary( ExpressionType.LessThan, Expression.Parameter( typeof ( int ), param ), Expression.Constant( constant, typeof ( int ) ) );
else if ( comparison == "<=" )
return Expression.MakeBinary( ExpressionType.LessThanOrEqual, Expression.Parameter( typeof ( int ), param ), Expression.Constant( constant, typeof ( int ) ) );
else if ( comparison == ">" )
return Expression.MakeBinary( ExpressionType.GreaterThan, Expression.Parameter( typeof ( int ), param ), Expression.Constant( constant, typeof ( int ) ) );
else if ( comparison == ">=" )
return Expression.MakeBinary( ExpressionType.GreaterThanOrEqual, Expression.Parameter( typeof ( int ), param ), Expression.Constant( constant, typeof ( int ) ) );
else
throw new ArgumentException( "Invalid expression.", "exp" );
}
ただし、たとえば次のような文字列がある場合、上記の方法は正しく機能しません。
string s4 = "a< 5" // no space between 'a' and '<'
string s5 = "b>=9" // no space at all
string s6 = "c <=7" // no space betwen '<=' and '7'
より堅牢で信頼性の高いものにする最も簡単な方法は何ですか?