解析表达式

时间:2012-10-15 17:17:11

标签: c# .net parsing

我有一些名为'ids'的集合List<ObjectId>。我想允许用户为'ids'创建灵活的过滤器。

我想创建一个文本框,用户必须在其中编写过滤字符串。例如:

item => item.ClassName == "Rectangle"

这个表达式我需要申请'ids'上的每个项目。我该如何尝试解析它以进行验证?如何在我的代码中为每个'ids'项运行它?

3 个答案:

答案 0 :(得分:1)

为什么不创建扩展List的类,然后可以创建get方法,如:

public class ObjectIdCollection : List<ObjectId>
{
    public ObjectIdCollection() { }
    public ObjectId this[string classname]
    {
        get
        {
            foreach(ObjectId id in this) if(id.ClassName == classname) return id;
            return null;
        }
    }
}

这将返回指定类名的第一个Id,如果找不到则返回null

答案 1 :(得分:1)

您可以利用Dynamic LINQ

答案 2 :(得分:0)

他们有很多lambda expression parsers可用。

使用以下逻辑解析并执行基于文本框(Say txtFilter)过滤字符串。

var ids = new List<ObjectId> 
             { 
                new ObjectId { ClassName = "Rectangle1", ID = 1 }, 
                new ObjectId { ClassName = "Rectangle2", ID = 2 } 
             };

string code = txtFilter.Text; (Ex: "item => item.ClassName == \"Rectangle1\"" ;)

Func<ObjectId, bool> func = ExpressionParser.Compile<Func<ObjectId, bool>>(code);      

ids.ForEach(obejctId => 
        {
            Console.WriteLine(func.Invoke(obejctId));
        });

输出

  True
  False