1

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

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

item => item.ClassName == "Rectangle"

我需要这个表达式适用于“ids”上的每个项目。如何尝试解析它以进行验证?如何在我的代码中为每个“ids”项目运行它?

4

3 回答 3

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

于 2012-10-15T17:24:58.527 回答
1

您可以利用动态 LINQ

于 2012-10-15T17:27:42.727 回答
0

它们是许多可用的lambda 表达式解析器

使用以下逻辑来解析和执行基于文本框(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
于 2012-10-15T19:41:53.573 回答