Có thể chuyển đổi chuỗi ký tự thành toán tử để sử dụng trong điều kiện logic không.C# chuyển đổi một chuỗi để sử dụng trong điều kiện logic
Ví dụ
if(x Convert.ToOperator(">") y) {}
hoặc
if(x ">" as Operator y){}
Tôi đánh giá cao điều này có thể không được chuẩn câu hỏi thực tế, do đó tôi không quan tâm đến câu trả lời mà hỏi tôi tại sao các địa ngục muốn làm một cái gì đó như thế này.
Cảm ơn trước
EDIT: OK Tôi đồng ý, chỉ công bằng khi đưa ra một số ngữ cảnh.
Chúng tôi có hệ thống được xây dựng xung quanh sự phản chiếu và XML. Tôi muốn có thể nói một cái gì đó như thế, một cách dễ dàng.
<Value = "Object1.Value" Operator = ">" Condition = "0"/>
EDIT: Cảm ơn nhận xét của bạn, tôi không thể giải thích chính xác điều này tại đây. Tôi đoán câu hỏi của tôi được trả lời bởi "Bạn không thể", đó là hoàn toàn tốt (và những gì tôi nghĩ). Cảm ơn ý kiến của bạn.
EDIT: Sod nó tôi sẽ có một đi.
Hãy tưởng tượng sau
<Namespace.LogicRule Value= "Object1.Value" Operator=">" Condition="0">
này sẽ được phản ánh vào một lớp học, vì vậy bây giờ tôi muốn kiểm tra điều kiện, bằng cách gọi
bool LogicRule.Test()
Đó là chút nơi mọi thứ rồi cũng cần phải tìm ra cùng với nhau.
EDIT:
OK, vì vậy đã không bao giờ nhìn Lambdas hoặc Expressions Tôi nghĩ tôi sẽ có một cái nhìn sau khi lời đề nghị @ jrista của.
Hệ thống của tôi cho phép Enums được phân tích cú pháp, vì vậy Biểu thức là hấp dẫn vì ExpressionType Enum.
Vì vậy, tôi đã tạo ra lớp sau để thử nghiệm ý tưởng:
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));
}
}
Rõ ràng điều này sẽ chỉ làm việc cho Int32 ngay bây giờ và ExpressionTypes cơ bản, tôi không chắc là tôi có thể làm cho nó chung chung? Tôi chưa bao giờ sử dụng Expressions trước đây, tuy nhiên điều này dường như làm việc.
Bằng cách này sau đó có thể được khai báo theo cách của chúng tôi như XML
Operation<Left="1" Right="2" ExpressionType="LessThan" Type="System.Int32"/>
Tôi sẽ không trả lời "tại sao bạn lại làm điều này" nhưng thay vào đó tôi sẽ bình luận :). Không cố gắng để được một nỗi đau, tôi chỉ tò mò là tại sao điều này là quan trọng đối với ứng dụng của bạn. – JaredPar
@JaredPar: Tôi thấy điều này mọi lúc: mọi người muốn lưu trữ nó trong một db và truy xuất nó để sử dụng trong mã sau. Không có nghĩa đó là một ý tưởng hay, nhưng đó là nơi nó xuất phát. –
Cảm ơn bạn đã cập nhật, nhưng bạn muốn làm gì với XML đó, và nó có ý nghĩa gì? Bạn có muốn có ví dụ đó trong một phần tử, "q" và làm "if (So sánh (q, x))" để so sánh biến "x" theo điều kiện được biểu thị trong phần tử XML không? –