public void Delegate_Test() { var test = new Dummy { Name = "Test" }; var count = 10000000; var obj = LambdaExtensions.GetPropertyValue(test, "Name"); var stopWatch = Stopwatch.StartNew(); for (int i = 0; i < count; i++) { LambdaExtensions.GetPropertyValue(test, "Name"); } stopWatch.Stop(); Logger.WriteLine($"Expression: {stopWatch.ElapsedMilliseconds}"); var objectType = test.GetType(); var method = objectType.GetProperty("Name")?.GetGetMethod(false); var proxy = (DummyCallback <Dummy>)Delegate.CreateDelegate(typeof(DummyCallback <Dummy>), method); stopWatch.Restart(); for (int i = 0; i < count; i++) { proxy(test); } stopWatch.Stop(); Logger.WriteLine($"Delegate: {stopWatch.ElapsedMilliseconds}"); }
public void GetPropertyValue_Test() { var dog = new Dog() { Foo = "test" }; var v1 = LambdaExtensions.GetPropertyValue(dog, nameof(dog.Foo)); Assert.Equal(dog.Foo, v1); var cat = new Cat() { Foo = 1 }; var v2 = LambdaExtensions.GetPropertyValue(cat, nameof(cat.Foo)); Assert.Equal(cat.Foo, v2); var fish = new Fish() { Foo = "test" }; var v3 = LambdaExtensions.GetPropertyValue(fish, nameof(fish.Foo)); Assert.Equal(fish.Foo, v3); var persian = new Persian() { Foo = 1 }; var v4 = LambdaExtensions.GetPropertyValue(persian, nameof(persian.Foo)); Assert.Equal(persian.Foo, v4); }
public void GetProperty() { var count = 10000; var s1 = new Dummy() { Name = "Argo" }; var pi = s1.GetType().GetProperty("Name"); var sw = Stopwatch.StartNew(); for (var i = 0; i < count; i++) { pi.GetValue(s1); } sw.Stop(); Logger.WriteLine($"Reflection: {sw.Elapsed}"); var invoker = LambdaExtensions.GetPropertyValueLambda <Dummy, string>(s1, "Name").Compile(); sw = Stopwatch.StartNew(); for (var i = 0; i < count; i++) { invoker(s1); } sw.Stop(); Logger.WriteLine($"Expression: {sw.Elapsed}"); }
public override void Add(T newInstance) { // use lock ? LambdaExtensions.SetPropertyValue(newInstance, _tKeyExpression, GetNewTKey()); _data.Add(newInstance); }
public void SetProperty() { var count = 10000; var s1 = new Dummy() { Name = "Argo" }; var sw = Stopwatch.StartNew(); var pi = s1.GetType().GetProperty("Name"); for (var i = 0; i < count; i++) { if (pi != null && pi.CanWrite) { if ((Nullable.GetUnderlyingType(pi.PropertyType) ?? pi.PropertyType) == typeof(string) && pi.CanWrite) { pi.SetValue(s1, "Dummy"); } } } sw.Stop(); Logger.WriteLine($"Reflection: {sw.Elapsed}"); sw = Stopwatch.StartNew(); var invoker = LambdaExtensions.SetPropertyValueLambda <Dummy, object>(s1, "Name").Compile(); for (var i = 0; i < count; i++) { invoker(s1, "Dummy"); } sw.Stop(); Logger.WriteLine($"Expression: {sw.Elapsed}"); }
/// <summary> /// 根据JSON格式的条件转换成Linq的条件语句 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="jsWhereFilter">JSON格式的查询条件</param> /// <returns>Linq查询条件</returns> public static Expression <Func <T, bool> > ConvertJsWhereToLinq <T>(string jsWhereFilter) { if (string.IsNullOrEmpty(jsWhereFilter)) { return(LambdaExtensions.True <T>()); } Expression <Func <T, bool> > whereLamda = null; var whereDic = DeserializeJson <Dictionary <string, string> >(jsWhereFilter); if (whereDic == null || !whereDic.Any()) { return(LambdaExtensions.True <T>()); } else { foreach (var field in whereDic) { if (whereLamda == null) { whereLamda = LambdaExtensions.GetContains <T>(field.Key, field.Value); } else { //todo 暂时用AlsoAnd whereLamda = whereLamda.And(LambdaExtensions.GetContains <T>(field.Key, field.Value)); } } } return(whereLamda ?? LambdaExtensions.False <T>()); }
public void Sort_Queryable() { var foos = new List <Foo> { new Foo { Name = "10", Count = 10 }, new Foo { Name = "10", Count = 20 }, new Foo { Name = "20", Count = 20 }, }.AsQueryable(); var orderFoos = LambdaExtensions.Sort(foos, new List <string>() { "Count desc", "Name" }); Assert.Equal(20, orderFoos.ElementAt(0).Count); Assert.Equal("20", orderFoos.ElementAt(1).Name); orderFoos = LambdaExtensions.Sort(foos, "Count", SortOrder.Unset); Assert.Equal(10, orderFoos.ElementAt(0).Count); orderFoos = LambdaExtensions.Sort(foos, "Count", SortOrder.Desc); Assert.Equal(20, orderFoos.ElementAt(0).Count); orderFoos = LambdaExtensions.Sort(foos, "Count", SortOrder.Asc); Assert.Equal(10, orderFoos.ElementAt(0).Count); orderFoos = LambdaExtensions.Sort(foos, "Test", SortOrder.Asc); Assert.Equal(10, orderFoos.ElementAt(0).Count); }
public void InvokeMethod() { var s1 = new Dummy() { Name = "Argo" }; var mi = s1.GetType().GetMethod("Method"); Assert.NotNull(mi); var sw = Stopwatch.StartNew(); for (var i = 0; i < Count; i++) { if (mi != null) { mi.Invoke(s1, null); } } sw.Stop(); Logger.WriteLine($"Reflection: {sw.Elapsed}"); var invoker = LambdaExtensions.GetPropertyValueLambda <Dummy, string>(s1, "Name").Compile(); sw = Stopwatch.StartNew(); for (var i = 0; i < Count; i++) { invoker.Invoke(s1); } sw.Stop(); Logger.WriteLine($"Expression: {sw.Elapsed}"); }
public void Delegate_Test() { var test = new Dummy { Name = "Test" }; var invoker = LambdaExtensions.GetPropertyValueLambda <Dummy, string>(test, "Name").Compile(); var stopWatch = Stopwatch.StartNew(); for (int i = 0; i < Count; i++) { invoker(test); } stopWatch.Stop(); Logger.WriteLine($"Expression: {stopWatch.Elapsed}"); var objectType = test.GetType(); var method = objectType.GetProperty("Name")?.GetGetMethod(false); if (method != null) { var proxy = (DummyCallback <Dummy>)Delegate.CreateDelegate(typeof(DummyCallback <Dummy>), method); stopWatch.Restart(); for (int i = 0; i < Count; i++) { proxy(test); } } stopWatch.Stop(); Logger.WriteLine($"Delegate: {stopWatch.Elapsed}"); }
/// <summary> /// 调用 OnQuery 回调方法获得数据源 /// </summary> protected async Task QueryData() { // https://gitee.com/LongbowEnterprise/BootstrapBlazor/issues/I29YK1 // 选中行目前不支持跨页 原因是选中行实例无法在翻页后保持 SelectedItems.Clear(); QueryData <TItem>?queryData = null; var queryOption = new QueryPageOptions() { IsPage = IsPagination, PageIndex = PageIndex, PageItems = PageItems, SearchText = SearchText, SortOrder = SortOrder, SortName = SortName, Filters = Filters.Values, Searchs = GetSearchs(), SearchModel = SearchModel }; if (OnQueryAsync != null) { queryData = await OnQueryAsync(queryOption); } else if (UseInjectDataService) { queryData = await GetDataService().QueryAsync(queryOption); } if (queryData != null) { Items = queryData.Items; TotalCount = queryData.TotalCount; IsFiltered = queryData.IsFiltered; IsSorted = queryData.IsSorted; IsSearch = queryData.IsSearch; // 外部未过滤,内部自行过滤 if (!IsFiltered && Filters.Any()) { Items = Items.Where(Filters.Values.GetFilterFunc <TItem>()); TotalCount = Items.Count(); } // 外部未处理排序,内部自行排序 if (!IsSorted && SortOrder != SortOrder.Unset && !string.IsNullOrEmpty(SortName)) { var invoker = SortLambdaCache.GetOrAdd(typeof(TItem), key => LambdaExtensions.GetSortLambda <TItem>().Compile()); Items = invoker(Items, SortName, SortOrder); } } if (!IsRendered && SelectedRows != null) { SelectedItems.AddRange(Items.Where(i => SelectedRows.Contains(i))); } }
private TOutput MapItem(IResultReader reader) { TOutput output = Activator.CreateInstance <TOutput>(); foreach (MappingItem <TOutput> mappingItem in _mappings) { Expression <Func <TOutput, object> > expression = mappingItem.Expression; LambdaExtensions.SetPropertyValue(output, expression, reader.ValueAs(expression.GetExpressionType(), mappingItem.ReaderKey)); } return(output); }
public void ElementCount_Ok() { var p1 = new List <string>() { "1", "2" }; Assert.Equal(2, LambdaExtensions.ElementCount(p1)); var p2 = new string[] { "1", "2" }; Assert.Equal(2, LambdaExtensions.ElementCount(p2)); }
public async Task <ResultDto> GetCities(GetCitiesInput input) { var expression = LambdaExtensions.CreateExpression <City>(); if (!string.IsNullOrWhiteSpace(input.Name)) { var andExpression = LambdaExtensions.CreateExpression <City>(o => o.Name.Contains(input.Name)); expression = LambdaExtensions.AdditionalExpression(expression, andExpression); } var cities = await _cityManager.FindAsync(expression); return(new ResultDto { Code = 0, Message = "获取成功!", Data = cities.MapTo <CityDto>() }); }
/// <summary> /// 将直接参数的条件转换成Linq的条件语句, 目前只支持 and 相连 /// </summary> /// <typeparam name="T">对象类型</typeparam> /// <param name="sParamWhere">直接条件表达式</param> /// <returns></returns> public static Expression <Func <T, bool> > ConvertParamWhereToLinq <T>(string sParamWhere) { if (string.IsNullOrEmpty(sParamWhere)) { return(LambdaExtensions.True <T>()); } Expression <Func <T, bool> > whereLamda = null; string[] whereList = sParamWhere.Split(new string[] { " and ", " AND " }, StringSplitOptions.RemoveEmptyEntries); //分隔 if (!whereList.Any()) { return(LambdaExtensions.True <T>()); } foreach (var whereDic in whereList) { string[] where = whereDic.Split(new string[] { " " }, StringSplitOptions.RemoveEmptyEntries); if (where.Length < 3) { continue; } string key = where[0]; string expression = where[1]; string value = where[2]; for (int i = 3; i < where.Length; i++) { value += " " + where[i].Trim(); } if (whereLamda == null) { whereLamda = LambdaExtensions.GetExpressionByString <T>(key, value, expression); } else { //todo 暂时用AlsoAnd whereLamda = whereLamda.And(LambdaExtensions.GetExpressionByString <T>(key, value, expression)); } } return(whereLamda ?? LambdaExtensions.False <T>()); }
public void SetPropertyValue_Test() { var dog = new Dog() { Foo = "test" }; var v1 = LambdaExtensions.SetPropertyValueLambda <Dog, string>(dog, nameof(dog.Foo)).Compile(); v1.Invoke(dog, "test1"); Assert.Equal("test1", dog.Foo); var cat = new Cat() { Foo = 1 }; var v2 = LambdaExtensions.SetPropertyValueLambda <Cat, int>(cat, nameof(cat.Foo)).Compile(); v2.Invoke(cat, 2); Assert.Equal(2, cat.Foo); var fish = new Fish() { Foo = "test" }; var v3 = LambdaExtensions.SetPropertyValueLambda <Fish, string>(fish, nameof(fish.Foo)).Compile(); v3.Invoke(fish, "test1"); Assert.Equal("test1", fish.Foo); var persian = new Persian() { Foo = 1 }; var v4 = LambdaExtensions.SetPropertyValueLambda <Persian, int>(persian, nameof(persian.Foo)).Compile(); v4.Invoke(persian, 2); Assert.Equal(2, persian.Foo); }
/// <summary> /// 检查 Value 是否合法 返回 true 表示合法 /// </summary> /// <param name="propertyValue"></param> protected virtual bool Validate(object?propertyValue) { var ret = true; if (propertyValue != null) { var type = propertyValue.GetType(); if (propertyValue is string value) { var count = SplitCallback(value); ret = Validate(count); } else if (type.IsGenericType || type.IsArray) { ret = Validate(LambdaExtensions.ElementCount(propertyValue)); } } else { ret = false; } return(ret); }
public void Sort_Complex() { var foos = new List <Dummy> { new() { Foo = new() { Name = "10", Count = 10 } }, new() { Foo = new() { Name = "10", Count = 20 } }, new() { Foo = new() { Name = "20", Count = 20 } } }; var orderFoos = LambdaExtensions.Sort(foos, "Foo.Count", SortOrder.Asc); Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count); orderFoos = LambdaExtensions.Sort(foos, "Foo.Count", SortOrder.Desc); Assert.Equal(20, orderFoos.ElementAt(0).Foo !.Count); orderFoos = LambdaExtensions.Sort(foos, "Foo1.Count", SortOrder.Desc); Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count); orderFoos = LambdaExtensions.Sort(foos, new List <string>() { "Foo.Count desc", "Foo.Name" }); Assert.Equal(20, orderFoos.ElementAt(0).Foo !.Count); orderFoos = LambdaExtensions.Sort(foos, new List <string>() { "Foo.Count", "Foo.Name Desc" }); Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count); orderFoos = LambdaExtensions.Sort(foos, new List <string>() { "Foo.Count", "Foo.Test Desc" }); Assert.Equal(10, orderFoos.ElementAt(0).Foo !.Count); }
/// <summary> /// /// </summary> /// <typeparam name="TType"></typeparam> /// <param name="model"></param> /// <param name="fieldName"></param> /// <returns></returns> private EventCallback <TType> CreateCallback <TType>(TModel model, string fieldName) { return(EventCallback.Factory.Create <TType>(this, t => { if (model != null) { var invoker = SetPropertyValueLambdaCache.GetOrAdd((typeof(TModel), fieldName), key => LambdaExtensions.SetPropertyValueLambda <TModel, object?>(model, key.FieldName).Compile()); invoker.Invoke(model, t); }
private RenderFragment AutoGenerateTemplate(IEditorItem item) => builder => { var fieldType = item.PropertyType; if (fieldType != null && Model != null) { var fieldName = item.GetFieldName(); // GetDisplayName // 先取 Text 属性值,然后取资源文件中的值 var displayName = item.GetDisplayName() ?? Utility.GetDisplayName(Model, fieldName); // FieldValue var valueInvoker = GetPropertyValueLambdaCache.GetOrAdd((typeof(TModel), fieldName), key => LambdaExtensions.GetPropertyValueLambda <TModel, object?>(Model, key.FieldName).Compile()); var fieldValue = valueInvoker.Invoke(Model); // ValueChanged var valueChangedInvoker = CreateLambda(fieldType).Compile(); var fieldValueChanged = valueChangedInvoker(Model, fieldName); // ValueExpression var body = Expression.Property(Expression.Constant(Model), typeof(TModel), fieldName); var tDelegate = typeof(Func <>).MakeGenericType(fieldType); var valueExpression = Expression.Lambda(tDelegate, body); if (IsDisplay) { builder.OpenComponent(0, typeof(Display <>).MakeGenericType(fieldType)); builder.AddAttribute(1, "DisplayText", displayName); builder.AddAttribute(2, "Value", fieldValue); builder.AddAttribute(3, "ValueChanged", fieldValueChanged); builder.AddAttribute(4, "ValueExpression", valueExpression); builder.AddAttribute(5, "ShowLabel", ShowLabel ?? true); builder.CloseComponent(); } else { var componentType = item.ComponentType ?? EditorForm <TModel> .GenerateComponent(fieldType, item.Rows != 0); builder.OpenComponent(0, componentType); builder.AddAttribute(1, "DisplayText", displayName); builder.AddAttribute(2, "Value", fieldValue); builder.AddAttribute(3, "ValueChanged", fieldValueChanged); builder.AddAttribute(4, "ValueExpression", valueExpression); builder.AddAttribute(5, "IsDisabled", item.Readonly); if (IsCheckboxList(fieldType) && item.Data != null) { builder.AddAttribute(6, nameof(CheckboxList <IEnumerable <string> > .Items), item.Data); } builder.AddMultipleAttributes(7, CreateMultipleAttributes(fieldType, fieldName, item)); builder.CloseComponent(); } } };
private RenderFragment AutoGenerateTemplate(IEditorItem item) => builder => { var fieldType = item.PropertyType; if (fieldType != null && Model != null) { // GetDisplayName var fieldName = item.GetFieldName(); var displayName = Utility.GetDisplayName(Model, fieldName); // FieldValue var valueInvoker = GetPropertyValueLambdaCache.GetOrAdd((typeof(TModel), fieldName), key => LambdaExtensions.GetPropertyValueLambda <TModel, object?>(Model, key.FieldName).Compile()); var fieldValue = valueInvoker.Invoke(Model); // ValueChanged var valueChangedInvoker = CreateLambda(fieldType).Compile(); var fieldValueChanged = valueChangedInvoker(Model, fieldName); // ValueExpression var body = Expression.Property(Expression.Constant(Model), typeof(TModel), fieldName); var tDelegate = typeof(Func <>).MakeGenericType(fieldType); var valueExpression = Expression.Lambda(tDelegate, body); var index = 0; var componentType = EditorForm <TModel> .GenerateComponent(fieldType); builder.OpenComponent(index++, componentType); builder.AddAttribute(index++, "DisplayText", displayName); builder.AddAttribute(index++, "Value", fieldValue); builder.AddAttribute(index++, "ValueChanged", fieldValueChanged); builder.AddAttribute(index++, "ValueExpression", valueExpression); builder.AddAttribute(index++, "IsDisabled", item.Readonly); builder.AddMultipleAttributes(index++, CreateMultipleAttributes(fieldType, fieldName, item)); builder.CloseComponent(); } };
/// <summary> /// 调用 OnQuery 回调方法获得数据源 /// </summary> protected async Task QueryData() { // https://gitee.com/LongbowEnterprise/BootstrapBlazor/issues/I29YK1 // 选中行目前不支持跨页 原因是选中行实例无法在翻页后保持 SelectedItems.Clear(); QueryData <TItem>?queryData = null; var queryOption = new QueryPageOptions() { IsPage = IsPagination, PageIndex = PageIndex, PageItems = PageItems, SearchText = SearchText, SortOrder = SortOrder, SortName = SortName, Filters = Filters.Values, Searchs = GetSearchs(), SearchModel = SearchModel }; if (OnQueryAsync != null) { queryData = await OnQueryAsync(queryOption); } else if (UseInjectDataService) { queryData = await GetDataService().QueryAsync(queryOption); } if (queryData != null) { Items = queryData.Items; if (IsTree) { KeySet.Clear(); if (TableTreeNode <TItem> .HasKey) { CheckExpandKeys(TreeRows); } if (KeySet.Count > 0) { TreeRows = new List <TableTreeNode <TItem> >(); foreach (var item in Items) { var node = new TableTreeNode <TItem>(item) { HasChildren = CheckTreeChildren(item), }; node.IsExpand = node.HasChildren && node.Key != null && KeySet.Contains(node.Key); if (node.IsExpand) { await RestoreIsExpand(node); } TreeRows.Add(node); } } else { TreeRows = Items.Select(item => new TableTreeNode <TItem>(item) { HasChildren = CheckTreeChildren(item) }).ToList(); } } TotalCount = queryData.TotalCount; IsFiltered = queryData.IsFiltered; IsSorted = queryData.IsSorted; IsSearch = queryData.IsSearch; // 外部未过滤,内部自行过滤 if (!IsFiltered && Filters.Any()) { Items = Items.Where(Filters.Values.GetFilterFunc <TItem>()); TotalCount = Items.Count(); } // 外部未处理排序,内部自行排序 if (!IsSorted && SortOrder != SortOrder.Unset && !string.IsNullOrEmpty(SortName)) { var invoker = SortLambdaCache.GetOrAdd(typeof(TItem), key => LambdaExtensions.GetSortLambda <TItem>().Compile()); Items = invoker(Items, SortName, SortOrder); } } if (SelectedRows != null) { SelectedItems.AddRange(Items.Where(i => SelectedRows.Contains(i))); } }
public static Action <T, int> ForEach <T>(this Action <T, int> e, IEnumerable <T> s) { LambdaExtensions.ForEach(s, e); return(e); }