我有一些名为'ids'的集合List<ObjectId>
。我想允许用户为'ids'创建灵活的过滤器。
我想创建一个文本框,用户必须在其中编写过滤字符串。例如:
item => item.ClassName == "Rectangle"
这个表达式我需要申请'ids'上的每个项目。我该如何尝试解析它以进行验证?如何在我的代码中为每个'ids'项运行它?
答案 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