Czy jest możliwe przekonwertowanie ciągu znaków na operator w celu użycia w stanie logicznym.C# przekonwertuj ciąg znaków do użycia w stanie logicznym.
Na przykład
if(x Convert.ToOperator(">") y) {}
lub
if(x ">" as Operator y){}
Rozumiem, że to może nie być standardową praktyką pytanie, więc nie jestem zainteresowany w odpowiedzi, które pytają mnie, dlaczego, do cholery, chciałby zrobić coś takiego.
góry dzięki
EDIT: OK, zgadzam się, tylko uczciwie dać pewien kontekst.
Mamy system zbudowany wokół odbicia i XML. Chciałbym móc powiedzieć coś takiego, dla ułatwienia.
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
EDYCJA: Dziękuję za komentarze, nie mogę tego dokładnie wyjaśnić tutaj. Domyślam się, że na moje pytanie odpowiada "Nie możesz", co jest absolutnie w porządku (i co myślałem). Dzięki za twoje komentarze.
EDYCJA: Sod it I'll have a go.
Wyobraźmy sobie następujący
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
To będzie odzwierciedlone w klasie, więc teraz chcę przetestować warunek, wywołując
bool LogicRule.Test()
To nieco gdzie to wszystko trzeba przyjść razem.
EDIT:
OK, więc nigdy nie spojrzał na lambdas lub wyrażenia myślałem, że mam opiekować użytkownika @ jrista sugestie.
Mój system umożliwia analizowanie wyliczeń, więc wyrażenia są atrakcyjne z powodu wyrażeń ExpressionType.
Stworzyłem więc następujące klasy przetestować pomysł:
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));
}
}
Oczywiście to będzie działać tylko dla Int32 teraz i podstawowe ExpressionTypes, nie jestem pewien, czy mogę zrobić to generyczny? Nigdy wcześniej nie używałam Wyrażeń, ale wydaje się, że działa.
W ten sposób mogą być zadeklarowane w naszej XML sposób
Operation<Left="1" Right="2" ExpressionType="LessThan" Type="System.Int32"/>
Nie odpowiem "dlaczego to robisz", ale zamiast tego skomentuję to :). Nie próbując być bólem, jestem tylko ciekawy, dlaczego jest to ważne dla twojej aplikacji. – JaredPar
@JaredPar: Widzę to cały czas: ludzie, którzy chcą przechowywać go w db i pobrać go do wykorzystania w kodzie później. To nie znaczy, że to dobry pomysł, ale właśnie z tego pochodzi. –
Dzięki za aktualizację, ale co chcesz zrobić z tym XML-em i co to znaczy? Czy chcesz mieć ten przykład w elemencie "q" i czy "if (Compare (q, x))" by porównać zmienną "x" zgodnie ze stanem wyrażonym w elemencie XML? –