È possibile convertire una stringa in un operatore per l'utilizzo in una condizione logica.C# converte una stringa per l'uso in una condizione logica
Per esempio
if(x Convert.ToOperator(">") y) {}
o
if(x ">" as Operator y){}
Mi rendo conto che questo potrebbe non essere questione pratica standard, perciò io non sono interessato a risposte che mi chiedono perché l'inferno vorrebbe fare qualcosa come questo.
Grazie in anticipo
EDIT: OK Sono d'accordo, giusto per dare qualche contesto.
Abbiamo un sistema basato su reflection e XML. Mi piacerebbe poter dire qualcosa del genere, per facilità.
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
EDIT: Grazie per i vostri commenti, non riesco a spiegarlo correttamente qui. Credo che alla mia domanda sia risposto "Non puoi", che è assolutamente soddisfacente (e cosa pensavo). Grazie per i tuoi commenti
EDIT: Sodd, sto per iniziare.
Immaginate la seguente
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
questo otterrà riflessa in una classe, in modo da ora voglio testare la condizione, chiamando
bool LogicRule.Test()
Questo è il pezzo in cui tutto sarebbe bisogno di venire insieme.
EDIT:
OK, quindi non avendo mai guardato Lambda Expressions o ho pensato di dare un'occhiata dopo @ di jrista suggerimenti.
Il mio sistema consente di analizzare l'enumerazione, quindi le espressioni sono interessanti a causa dell'ExpressionType Enum.
così ho creato la seguente classe di testare l'idea:
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));
}
}
Ovviamente questo funziona solo per Int32 in questo momento e le ExpressionTypes di base, io non sono sicuro che posso farlo generica? Non ho mai usato le espressioni prima, tuttavia questo sembra funzionare.
In questo modo può quindi essere dichiarato nel nostro modo XML come
Operation<Left="1" Right="2" ExpressionType="LessThan" Type="System.Int32"/>
Non risponderò "perché stai facendo questo" ma lo commenterò invece :). Non sto cercando di essere un dolore, sono solo curioso di sapere perché questo è importante per la tua applicazione. – JaredPar
@JaredPar: lo vedo sempre: persone che vogliono archiviarlo in un db e recuperarlo per usarlo nel codice più tardi. Non significa che sia una buona idea, ma è da lì che viene. –
Grazie per l'aggiornamento, ma cosa vuoi fare con quell'XML e cosa significa? Vuoi avere quell'esempio in un elemento, "q", e fai "if (Compare (q, x))" per confrontare la variabile "x" in base alla condizione espressa nell'elemento XML? –