論理条件で使用するために文字列を演算子に変換することは可能ですか?
例えば
if(x Convert.ToOperator(">") y) {}
また
if(x ">" as Operator y){}
これは標準的な練習用の質問ではない可能性があることを理解しています。したがって、なぜこのようなことをしたいのかを尋ねる回答には興味がありません。
前もって感謝します
編集:わかりました、同意します。状況を説明するのは公正です。
リフレクションと XML を中心に構築されたシステムがあります。簡単に、みたいなことを言いたいです。
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
編集: コメントありがとうございます。ここでこれを適切に説明することはできません。私の質問は「できません」と答えられたと思いますが、これはまったく問題ありません(そして私が考えたことです)。コメントしてくれてありがとう。
編集:だから、私は試してみるつもりです。
次のことを想像してください
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
これはクラスに反映されるので、呼び出して条件をテストしたいと思います
bool LogicRule.Test()
それは、すべてをまとめる必要がある部分です。
編集:
OK、ラムダや式を見たことがないので、@jrista の提案を見てみたいと思いました。
私のシステムでは Enum を解析できるため、ExpressionType Enum のおかげで Expression は魅力的です。
そこで、アイデアをテストするために次のクラスを作成しました。
public class Operation
{
private object _Right;
private object _Left;
private ExpressionType _ExpressionType;
private string _Type;
public object Left
{
get { return _Left; }
set { _Left = value; }
}
public object Right
{
get { return _Right; }
set { _Right = value; }
}
public string Type
{
get { return _Type; }
set { _Type = value; }
}
public ExpressionType ExpressionType
{
get { return _ExpressionType; }
set { _ExpressionType = value; }
}
public bool Evaluate()
{
var param = Expression.Parameter(typeof(int), "left");
var param2 = Expression.Parameter(typeof(int), "right");
Expression<Func<int, int, bool>> expression = Expression.Lambda<Func<int, int, bool>>(
Expression.MakeBinary(ExpressionType, param, param2), param, param2);
Func<int, int, bool> del = expression.Compile();
return del(Convert.ToInt32(Left), Convert.ToInt32(Right));
}
}
明らかに、これは現在 Int32 と基本的な ExpressionTypes でのみ機能します。汎用にできるかどうかわかりません。これまで式を使用したことはありませんが、これはうまくいくようです。
この方法は、XML の方法で次のように宣言できます。
Operation<Left="1" Right="2" ExpressionType="LessThan" Type="System.Int32"/>