我有两个申请。一个应用程序将选项和配置保存为JSON,另一个应用程序读取JSON并根据JSON中的字段执行其任务。现在,我想过滤application-2中的列表。我该如何传递我希望列表被过滤成字符串以存储在JSON中,然后由application-2重新解释的方式?
是否有序列化linq / lambda表达式并反序列化它们?还是有更好的方法,例如创建一个包含一些可过滤选项的类,例如等于,不等于,大于,小于,包含等?
答案 0 :(得分:1)
不幸的是,由于它是在编译时生成的,因此无法在c#中对lamda表达式进行序列化和序列化。
编译后的Lamda会生成一个函数,并且当使用lamda表达式时,编译器会调用此函数。
您有一个选择,但这并不容易:) yy必须将c#代码存储在json文件中,然后application-2将对其进行读取,解析,编译并执行。
但它不仅是一个lamdba表达式,还将是一个完整的程序集(像一个类)。
如果使用:net framrwork,请参考以下示例: https://www.codeproject.com/Tips/715891/Compiling-Csharp-Code-at-Runtime
如果使用.Net Core,则必须使用roslyn:https://josephwoodward.co.uk/2016/12/in-memory-c-sharp-compilation-using-roslyn
希望对您有所帮助
答案 1 :(得分:0)
如果要过滤纯JSON中的javascript数组,可以使用Jpath和Json.Net
例如:
var token = JToken.Parse("json string here")
var tokens = token.SelectTokens("$.YourJsonArray[?(@.Property == something)]")
答案 2 :(得分:0)
我找到了解决此问题的另一种方法。您可以从字符串存储和还原表达式! :)
唯一需要的是,两个模块(在您的情况下为两个程序)必须是已知的相同类型。
示例代码:
var discountFilter = "album => album.Quantity > 0";
var options = ScriptOptions.Default.AddReferences(typeof(Album).Assembly);
Func<Album, bool> discountFilterExpression =
await CSharpScript.EvaluateAsync<Func<Album, bool>>(discountFilter, options);
var discountedAlbums = albums.Where(discountFilterExpression);
降级 gy