2012-10-15 122 views
1

我有一些集合List<ObjectId>称为'ids'。我想让用户为'ids'创建灵活的过滤器。解析表达式

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

item => item.ClassName == "Rectangle" 

这个表达式我需要申请'ids'上的每个项目。我怎样才能尝试解析它的验证?我如何在我的代码中为每个“ID”项目运行它?

+1

这是这样的:http://msdn.microsoft.com/en-us/library/bb397951.aspx – BlackBear

+1

的ObjectId是'int'或类? –

+0

@CongLong它是阶级,而不是结构。 –

回答

1

你可以采取的Dynamic LINQ

+0

是的,我认为,这是我必要的!谢谢! –

+0

噢,停下来...是否只用数据库工作? –

+0

@Bush:你可以先调用'AsQueryable()' –

1

你为什么不创建一个扩展列表中的一个类,那么你可以创建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发现

+0

否,过滤器的表达式可以是ANY。用户必须通过文本框进行设置。我必须用它表达。 –

0

优势,他们有很多lambda expression parsers可用。

使用以下逻辑解析并执行基于文本框(说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