我有一些集合List<ObjectId>
称为'ids'。我想让用户为'ids'创建灵活的过滤器。解析表达式
我想创建一个文本框,用户必须编写一个过滤器字符串。例如:
item => item.ClassName == "Rectangle"
这个表达式我需要申请'ids'上的每个项目。我怎样才能尝试解析它的验证?我如何在我的代码中为每个“ID”项目运行它?
我有一些集合List<ObjectId>
称为'ids'。我想让用户为'ids'创建灵活的过滤器。解析表达式
我想创建一个文本框,用户必须编写一个过滤器字符串。例如:
item => item.ClassName == "Rectangle"
这个表达式我需要申请'ids'上的每个项目。我怎样才能尝试解析它的验证?我如何在我的代码中为每个“ID”项目运行它?
你为什么不创建一个扩展列表中的一个类,那么你可以创建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发现
否,过滤器的表达式可以是ANY。用户必须通过文本框进行设置。我必须用它表达。 –
优势,他们有很多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
这是这样的:http://msdn.microsoft.com/en-us/library/bb397951.aspx – BlackBear
的ObjectId是'int'或类? –
@CongLong它是阶级,而不是结构。 –