From 95fa6d52410f55c769f2e2c882d71514ba5f0a4b Mon Sep 17 00:00:00 2001 From: huqingjie Date: Thu, 20 Apr 2023 17:38:07 +0800 Subject: [PATCH 1/4] Result.UnWrapAsync --- src/DotNetCommon.Core/Data/Result.cs | 17 ++++++--- .../Extensions/TaskExtensions.cs | 16 +++++--- tests/DotNetCommon.Test/Data/ResultTests.cs | 38 +++++++++++++------ 3 files changed, 49 insertions(+), 22 deletions(-) diff --git a/src/DotNetCommon.Core/Data/Result.cs b/src/DotNetCommon.Core/Data/Result.cs index cdc62d1..b16b74a 100644 --- a/src/DotNetCommon.Core/Data/Result.cs +++ b/src/DotNetCommon.Core/Data/Result.cs @@ -539,16 +539,21 @@ namespace DotNetCommon.Data public static class ResultExtensions { /// - /// 解开Result模型,null值则返回 default(T) - /// Result.Success为true则返回模型,否则抛出ResultException异常 + /// 解开Result模型, Result.Success为true则返回模型,否则抛出ResultException异常 /// - /// - /// - /// public static T UnWrap(this Result result) { if (result.Success) return result.Data; - throw new Exception(result.Message); + throw new ResultException(result.Message); + } + + /// + /// 解开Result模型, Result.Success为true则返回模型,否则抛出ResultException异常 + /// + public static object UnWrap(this Result result) + { + if (result.Success) return result.Data; + throw new ResultException(result.Message); } } } diff --git a/src/DotNetCommon.Core/Extensions/TaskExtensions.cs b/src/DotNetCommon.Core/Extensions/TaskExtensions.cs index fc06294..8ea3525 100644 --- a/src/DotNetCommon.Core/Extensions/TaskExtensions.cs +++ b/src/DotNetCommon.Core/Extensions/TaskExtensions.cs @@ -14,7 +14,7 @@ public static class TaskExtensions { /// - /// 通用异步转换方法,参照: + /// 通用异步转换方法,参照: /// /// /// @@ -26,12 +26,18 @@ } /// - /// 通用异步转换方法,参照: + /// 解开Result模型, Result.Success为true则返回模型,否则抛出ResultException异常 /// - /// - /// - /// public static async Task UnWrapAsync(this Task> task) + { + var t = await task.ContinueWith(t => t.Result.UnWrap()); + return t; + } + + /// + /// 解开Result模型, Result.Success为true则返回模型,否则抛出ResultException异常 + /// + public static async Task UnWrapAsync(this Task task) { return await task.ContinueWith(t => t.Result.UnWrap()); } diff --git a/tests/DotNetCommon.Test/Data/ResultTests.cs b/tests/DotNetCommon.Test/Data/ResultTests.cs index 2bac715..97e4263 100644 --- a/tests/DotNetCommon.Test/Data/ResultTests.cs +++ b/tests/DotNetCommon.Test/Data/ResultTests.cs @@ -1,4 +1,5 @@ -using DotNetCommon.Data; +using DotNetCommon.Data; +using DotNetCommon.Extensions; using NUnit.Framework; using Shouldly; using System; @@ -15,7 +16,7 @@ namespace DotNetCommon.Test public void Test() { Result.NotOk("error", code: 20002, data: new { }, extData: "errorDetail"); - Result.OkPage(10, new List() { "xiaoming", "С" }); + Result.OkPage(10, new List() { "xiaoming", "小王" }); } public class GetPersonPageReq : PageQuery @@ -35,14 +36,14 @@ namespace DotNetCommon.Test [Test] public async Task ResultWrapTest() { - //ͬ: 쳣 + //同步代码块: 捕获异常 var res = Result.Wrap(() => { int i = 0; i = 5 / i; }); res.Success.ShouldBe(false); - //첽: 쳣 + //异步代码块: 捕获异常 var res2 = await Result.Wrap(async () => { await Task.Run(() => @@ -63,14 +64,14 @@ namespace DotNetCommon.Test [Test] public async Task ResultWrapReturnTest() { - //ͬ: 쳣 + //同步代码块: 捕获异常 var res = Result.WrapReturn(() => { int i = 0; return 5 / i; }); res.Success.ShouldBe(false); - //첽: 쳣 + //异步代码块: 捕获异常 var res2 = await Result.WrapReturn(async () => { return await Task.Run(() => @@ -98,12 +99,27 @@ namespace DotNetCommon.Test var i = res.UnWrap(); i.ShouldBe(1); - res = Result.NotOk("ʧ"); + res = Result.NotOk("失败"); var exp = Should.Throw(() => { res.UnWrap(); }); - exp.Message.ShouldBe("ʧ"); + exp.Message.ShouldBe("失败"); + } + + [Test] + public async Task ResultUnWrapAsyncTest() + { + var res = Task.FromResult(Result.Ok(1)); + var i = await res.UnWrapAsync(); + i.ShouldBe(1); + + var res2 = Task.FromResult(Result.NotOk("失败")); + var exp = Should.Throw(async () => + { + await res2.UnWrapAsync(); + }); + exp.Message.ShouldBe("失败"); } [Test] @@ -114,7 +130,7 @@ namespace DotNetCommon.Test { // return new Result(); return Result.NewInstance(); - return Result.Ok().SetData("һЩ").SetCode(100).SetExtData(new { }).SetSuccess().SetFail().SetSuccessFlag(true); + return Result.Ok().SetData("一些数据").SetCode(100).SetExtData(new { }).SetSuccess().SetFail().SetSuccessFlag(true); } testMethod2(); Result testMethod2() @@ -152,7 +168,7 @@ namespace DotNetCommon.Test res.Success.ShouldBeTrue(); res.Data.ShouldBe(0); - // + //控制器 async Task> Controller(int id) { return await Result.OkAsync(Service(id)); @@ -161,7 +177,7 @@ namespace DotNetCommon.Test //service async Task Service(int id) { - //ģʱ + //模拟耗时请求 var count = await Task.FromResult(id == 1 ? 100 : 0); return count; } -- Gitee From cac6b4d0568747327a1f3734b7b436d27d8c166b Mon Sep 17 00:00:00 2001 From: huqingjie Date: Thu, 20 Apr 2023 17:49:04 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E5=8F=91=E7=89=88=20v3.1.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DotNetCommon.Core/DotNetCommon.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DotNetCommon.Core/DotNetCommon.Core.csproj b/src/DotNetCommon.Core/DotNetCommon.Core.csproj index 8d2396e..4f3cc28 100644 --- a/src/DotNetCommon.Core/DotNetCommon.Core.csproj +++ b/src/DotNetCommon.Core/DotNetCommon.Core.csproj @@ -1,7 +1,7 @@ - 3.1.1 + 3.1.2 True .net常用功能及数据模型,包含: -- Gitee From 4ff4919b2f59f83fba1fb7da47c47aab8932ed4f Mon Sep 17 00:00:00 2001 From: jackletter <1286317554@qq.com> Date: Sat, 13 May 2023 23:54:07 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E4=BC=98=E5=8C=96=20ExpressionHelper.Reduc?= =?UTF-8?q?eLambda=20=E4=B8=BB=E8=A6=81=E5=AF=B9=E5=B5=8C=E5=A5=97lambda?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E7=B2=BE=E7=AE=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/DotNetCommon.Core/ExpressionHelper.cs | 11 ++++++-- .../Expressions/Base/BaseVisit.cs | 14 ++++++++-- .../Expressions/Visit/VisitImplements.cs | 16 +++++++++--- .../ReduceLambdaTests.cs | 26 +++++++++++++++++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/src/DotNetCommon.Core/ExpressionHelper.cs b/src/DotNetCommon.Core/ExpressionHelper.cs index 369debd..e3f9f9f 100644 --- a/src/DotNetCommon.Core/ExpressionHelper.cs +++ b/src/DotNetCommon.Core/ExpressionHelper.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Text; +using System.Xml.Linq; namespace DotNetCommon { @@ -179,7 +180,7 @@ namespace DotNetCommon var root = new ExpressionNode { Expression = lambdaExpression, - _parameters = lambdaExpression.Parameters.ToList(), + _parameters = new List(), Children = new List() }; VisitTree(root); @@ -196,7 +197,7 @@ namespace DotNetCommon void VisitTree(ExpressionNode node) { if (node.Expression == null) return; - var visit = _caches[node.NodeType]; + var visit = GetVisit(node.NodeType); visit.Reduce(node, VisitTree); } } @@ -290,5 +291,11 @@ namespace DotNetCommon { ExpressionType.IsFalse, new IsFalseVisit() }, #endregion }; + + internal static BaseVisit GetVisit(ExpressionType expressionType) + { + var visit = _caches[expressionType]; + return visit; + } } } diff --git a/src/DotNetCommon.Core/Expressions/Base/BaseVisit.cs b/src/DotNetCommon.Core/Expressions/Base/BaseVisit.cs index 66bec3b..d6c5131 100644 --- a/src/DotNetCommon.Core/Expressions/Base/BaseVisit.cs +++ b/src/DotNetCommon.Core/Expressions/Base/BaseVisit.cs @@ -1,3 +1,4 @@ +using DotNetCommon.Expressions.Visit; using System; using System.Collections.Generic; using System.Linq.Expressions; @@ -78,7 +79,14 @@ namespace DotNetCommon.Expressions.Base var child = node.Children[i]; if (!child.HasParameter && child.Expression != null) { - if (child.NodeType != ExpressionType.Constant) + if (child.NodeType == ExpressionType.Lambda) + { + //lambda表达式节点不能再进一步简化,最多将它的body简化成常量 + //因为有的方法本身接受的就是lambda表达式 + node.Children[i]._updateRequest = true; + //node.Children[i].FullMarkString = GenerateFullMarkString(node.Children[i]); + } + else if (child.NodeType != ExpressionType.Constant) { //进行简化 var res = child.Reduce(); @@ -87,8 +95,9 @@ namespace DotNetCommon.Expressions.Base { Parent = node, Expression = contant, - _updateRequest = true + _updateRequest = true, }; + node.Children[i].FullMarkString = ConstantVisit.StaticGenerateFullMarkString(node.Children[i]); } } } @@ -97,6 +106,7 @@ namespace DotNetCommon.Expressions.Base if (node.NeedUpdate) { node.Expression = Rebuild(node); + node.FullMarkString = ExpressionHelper.GetVisit(node.NodeType).GenerateFullMarkString(node); } } diff --git a/src/DotNetCommon.Core/Expressions/Visit/VisitImplements.cs b/src/DotNetCommon.Core/Expressions/Visit/VisitImplements.cs index 431ec87..6bddd5f 100644 --- a/src/DotNetCommon.Core/Expressions/Visit/VisitImplements.cs +++ b/src/DotNetCommon.Core/Expressions/Visit/VisitImplements.cs @@ -101,6 +101,7 @@ namespace DotNetCommon.Expressions.Visit node._updateRequest = true; node.Children.Clear(); node.IsParameter = false; + node.FullMarkString = ConstantVisit.StaticGenerateFullMarkString(node); } } } @@ -139,6 +140,7 @@ namespace DotNetCommon.Expressions.Visit node._updateRequest = true; node.Children.Clear(); node.IsParameter = false; + node.FullMarkString = ConstantVisit.StaticGenerateFullMarkString(node); } } } @@ -414,16 +416,18 @@ namespace DotNetCommon.Expressions.Visit var left = node.Children[1]; node.Expression = left.Expression; node._updateRequest = true; + node.IsParameter = node.Children[1].IsParameter; + node.FullMarkString = node.Children[1].FullMarkString; node.Children.Clear(); - node.IsParameter = false; } else { - var right = node.Children[1]; + var right = node.Children[2]; node.Expression = right.Expression; node._updateRequest = true; + node.IsParameter = node.Children[2].IsParameter; + node.FullMarkString = node.Children[2].FullMarkString; node.Children.Clear(); - node.IsParameter = false; } } } @@ -444,6 +448,11 @@ namespace DotNetCommon.Expressions.Visit } protected override string GenerateFullMarkString(ExpressionNode node) + { + return StaticGenerateFullMarkString(node); + } + + internal static string StaticGenerateFullMarkString(ExpressionNode node) { var contant = node.Expression as ConstantExpression; if (node.IsLocalVariable) @@ -551,6 +560,7 @@ namespace DotNetCommon.Expressions.Visit protected override void Prepare(ExpressionNode node) { var lambdaExpression = node.Expression as LambdaExpression; + node.Parameters.Add(lambdaExpression.Parameters); node.Children.Add(new ExpressionNode { Parent = node, diff --git a/tests/DotNetCommon.Test/ExpressionHelperTests/ReduceLambdaTests.cs b/tests/DotNetCommon.Test/ExpressionHelperTests/ReduceLambdaTests.cs index cbbed0f..99e208a 100644 --- a/tests/DotNetCommon.Test/ExpressionHelperTests/ReduceLambdaTests.cs +++ b/tests/DotNetCommon.Test/ExpressionHelperTests/ReduceLambdaTests.cs @@ -401,6 +401,32 @@ namespace DotNetCommon.Test.ExpressionHelperTests } #endregion + + #region + class Person2 + { + public int Id { get; set; } + public int Age { get; set; } + } + [Test] + public void NestedLambdaTest() + { + //内嵌lambda表达式 + var flag = 1 > 0; + Expression, bool>> lambda2 = (IEnumerable i) => i.Count() > 0 && i.Where(p => p.Id > 100 && flag).Any(); + var ret2 = ExpressionHelper.ReduceLambda(lambda2); + ret2.ToString().ShouldBe("i => ((i.Count() > 0) AndAlso i.Where(p => ((p.Id > 100) AndAlso True)).Any())"); + + Expression, object>> lambda = (IEnumerable i) => i.Where(p => p.Id > 100 || flag); + var ret = ExpressionHelper.ReduceLambda(lambda); + ret.ToString().ShouldBe("i => i.Where(p => True)"); + var del = (ret as LambdaExpression).Compile(); + var res = del.DynamicInvoke(new[] { new List { new Person2() { Id = 2, Age = 18 } } }) as IEnumerable; + res.Count().ShouldBe(1); + res.FirstOrDefault().Id.ShouldBe(2); + res.FirstOrDefault().Age.ShouldBe(18); + } + #endregion } #endregion -- Gitee From 90ca79085450f0165bced02561853fc7e75a60b6 Mon Sep 17 00:00:00 2001 From: jackletter <1286317554@qq.com> Date: Sat, 13 May 2023 23:56:56 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E5=8F=91=E7=89=88=20v3.1.3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/README.md | 2 +- src/DotNetCommon.Core/DotNetCommon.Core.csproj | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index fd53ab9..e023be6 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ - **从 3.0 后分离了各个功能包,极力避免`DotNetCommon.Core`对其他包的依赖;** -- **从 4.0 后使用`SharpCompress`替代`SharpZipLib`**封装解压缩功能; +- **从 4.0 后使用`SharpCompress`替代`SharpZipLib` 封装解压缩功能;** **整体关系如下图:** diff --git a/docs/README.md b/docs/README.md index badb340..7289256 100644 --- a/docs/README.md +++ b/docs/README.md @@ -18,7 +18,7 @@ - **从 3.0 后分离了各个功能包,极力避免`DotNetCommon.Core`对其他包的依赖;** -- **从 4.0 后使用`SharpCompress`替代`SharpZipLib`**封装解压缩功能; +- **从 4.0 后使用`SharpCompress`替代`SharpZipLib`封装解压缩功能;** **整体关系如下图:** diff --git a/src/DotNetCommon.Core/DotNetCommon.Core.csproj b/src/DotNetCommon.Core/DotNetCommon.Core.csproj index 4f3cc28..b9cbfc3 100644 --- a/src/DotNetCommon.Core/DotNetCommon.Core.csproj +++ b/src/DotNetCommon.Core/DotNetCommon.Core.csproj @@ -1,7 +1,7 @@ - 3.1.2 + 3.1.3 True .net常用功能及数据模型,包含: -- Gitee