这可能是一个愚蠢的问题,但就这样吧。我希望能够从数据库 VARCHAR 列或任何字符串解析的字符串动态构造谓词 。例如,假设数据库中的列包含以下字符串:
return e.SomeStringProperty.Contains("foo");
这些代码/字符串值将存储在数据库中,知道通用“e”的可能属性是什么,并知道它们必须返回布尔值。然后,在一个神奇、奇妙、幻想的世界中,代码可以在不知道谓词是什么的情况下执行,例如:
string predicateCode = GetCodeFromDatabase();
var allItems = new List<SomeObject>{....};
var filteredItems = allItems.FindAll(delegate(SomeObject e) { predicateCode });
或 Lambda 化:
var filteredItems = allItems.FindAll(e => [predicateCode]);
我知道它可能永远不会这么简单,但是有没有一种方法,也许使用 Reflection.Emit,从文本动态创建委托代码并将其提供给 FindAll (或任何其他匿名/扩展)方法?
C# 和 VB 编译器可在 .NET Framework 中使用:
C# CodeDom 提供程序 http://msdn.microsoft.com/en-us/library/microsoft.csharp.csharpcodeprovider.aspx
但请注意,这样您最终会得到一个单独的程序集(只有在单独的 AppDomain 中才能卸载它)。仅当您可以立即编译所需的所有谓词时,此方法才可行。否则会涉及太多的开销。
System.Reflection.Emit 是一个很棒的 API,用于为 CLR 动态发出代码。不过使用起来有点麻烦,必须学习CIL。
LINQ 表达式树是一个易于使用的后端(编译为 CIL),但您必须编写自己的解析器。
我建议您看一下在 CLR(或 DLR)上运行的“动态语言”之一,例如铁蟒 http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython。如果您问我的话,这是实现此功能的最有效方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)