当前位置:网站首页>Newbe.ObjectVisitor Example 1
Newbe.ObjectVisitor Example 1
2020-11-08 20:18:00 【Newbe36524】
We have added some scenarios and practice instructions that can be used to implement the functions of the library .
Transform the database link string into a data model , Or format the data model as a link string .
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using FluentAssertions;
using NUnit.Framework;
namespace Newbe.ObjectVisitor.Tests
{
public class DataConnectionModelTest
{
public const string ConnectionStringValue =
"Host=www.newbe.pro;Port=36524;Username=newbe36524;Password=newbe.pro;";
[Test]
public void JoinToString()
{
var model = new DataConnectionModel
{
Host = "www.newbe.pro",
Port = 36524,
Username = "newbe36524",
Password = "newbe.pro",
};
var connectionString = model.ToString();
connectionString.Should().Be(ConnectionStringValue);
}
[Test]
public void BuildFromString()
{
var model = DataConnectionModel.FromString(ConnectionStringValue);
var expected = new DataConnectionModel
{
Host = "www.newbe.pro",
Port = 36524,
Username = "newbe36524",
Password = "newbe.pro",
};
model.Should().BeEquivalentTo(expected);
}
public class DataConnectionModel
{
public string Host { get; set; } = null!;
public ushort? Port { get; set; } = null!;
public string Username { get; set; } = null!;
public string Password { get; set; } = null!;
public int? MaxPoolSize { get; set; } = null!;
private static readonly ICachedObjectVisitor<DataConnectionModel, StringBuilder> ConnectionStringBuilder =
default(DataConnectionModel)!
.V()
.WithExtendObject<DataConnectionModel, StringBuilder>()
.ForEach((name, value, sb) => AppendValueIfNotNull(name, value, sb))
.Cache();
private static void AppendValueIfNotNull(string name, object? value, StringBuilder sb)
{
if (value != null)
{
sb.Append($"{name}={value};");
}
}
public override string ToString()
{
var sb = new StringBuilder();
ConnectionStringBuilder.Run(this, sb);
return sb.ToString();
}
private static readonly ICachedObjectVisitor<DataConnectionModel, Dictionary<string, string>>
ConnectionStringConstructor
=
default(DataConnectionModel)!
.V()
.WithExtendObject<DataConnectionModel, Dictionary<string, string>>()
.ForEach(context => SetValueIfFound(context))
.Cache();
private static void SetValueIfFound(
IObjectVisitorContext<DataConnectionModel, Dictionary<string, string>, object> c)
{
if (c.ExtendObject.TryGetValue(c.Name, out var stringValue))
{
TypeConverter conv = TypeDescriptor.GetConverter(c.PropertyInfo.PropertyType);
c.Value = conv.ConvertFrom(stringValue)!;
}
}
public static DataConnectionModel FromString(string connectionString)
{
var dic = connectionString.Split(';')
.Where(x => !string.IsNullOrEmpty(x))
.Select(x => x.Split('='))
.ToDictionary(x => x[0], x => x[1]);
var re = new DataConnectionModel();
ConnectionStringConstructor.Run(re, dic);
return re;
}
}
}
} |
Replace the fields that meet the mobile phone number format in the object with ciphertext , Avoid sensitive information output .
using System.Text.RegularExpressions;
using FluentAssertions;
using NUnit.Framework;
namespace Newbe.ObjectVisitor.Tests
{
public class ChangePasswordTest
{
[Test]
public void CoverSensitiveDataTest()
{
// here is a model
var userModel = new UserModel
{
Username = "newbe36524",
Password = "newbe.pro",
Phone = "12345678901"
};
// create a data visitor to cover sensitive data
var visitor = userModel.V()
.ForEach<UserModel, string>(x => CoverSensitiveData(x))
.Cache();
visitor.Run(userModel);
var expected = new UserModel
{
Username = "newbe36524",
Password = "***",
Phone = "123****8901",
};
userModel.Should().BeEquivalentTo(expected);
}
private void CoverSensitiveData(IObjectVisitorContext<UserModel, string> c)
{
var value = c.Value;
if (!string.IsNullOrEmpty(value))
{
c.Value = Regex.Replace(value, "(\\d{3})\\d{4}(\\d{4})", "$1****$2");
}
if (c.Name == nameof(UserModel.Password))
{
c.Value = "***";
}
}
public class UserModel
{
public string Username { get; set; } = null!;
public string Phone { get; set; } = null!;
public string Password { get; set; } = null!;
}
}
} |
Will be realized IEnumerable<int>
The sum of all properties of .
using System.Collections.Generic;
using System.Linq;
using FluentAssertions;
using NUnit.Framework;
namespace Newbe.ObjectVisitor.Tests
{
public class EnumerableTest
{
[Test]
public void NameAndValue()
{
var model = new TestModel
{
List1 = new[] {1},
List2 = new[] {2},
List3 = new List<int> {3},
List4 = new HashSet<int> {4}
};
var sumBag = new SumBag();
var visitor = model.V()
.WithExtendObject(sumBag)
.ForEach<TestModel, SumBag, IEnumerable<int>>((name, value, bag) => Sum(bag, value),
x => x.IsOrImplOf<IEnumerable<int>>())
.Cache();
visitor.Run(model, sumBag);
sumBag.Sum.Should().Be(10);
}
private static void Sum(SumBag bag, IEnumerable<int> data)
{
bag.Sum += data.Sum();
}
public class SumBag
{
public int Sum { get; set; }
}
public class TestModel
{
public int[] List1 { get; set; } = null!;
public IEnumerable<int> List2 { get; set; } = null!;
public List<int> List3 { get; set; } = null!;
public HashSet<int> List4 { get; set; } = null!;
}
}
} |
Release notes
- Newbe.ObjectVisitor 0.2.10 Release , More colorful
- Newbe.ObjectVisitor 0.1.4 Release , The initial release
Use samples
Share with others
- Looking for better performance dynamics Getter and Setter programme
- Looking for a smaller immutable dictionary with better performance
GitHub Project address :https://github.com/newbe36524/Newbe.ObjectVisitor
Gitee Project address :https://gitee.com/yks/Newbe.ObjectVisitor
- The author of this article : newbe36524
- Link to this article : https://www.newbe.pro/Newbe.ObjectVisitor/Example-1/
- Copyright notice : All articles in this blog except special statement , All adopt BY-NC-SA license agreement . Reprint please indicate the source !
版权声明
本文为[Newbe36524]所创,转载请带上原文链接,感谢
边栏推荐
- 不是程序员,代码也不能太丑!python官方书写规范:任何人都该了解的 pep8
- Dynamic relu: Microsoft's refreshing device may be the best relu improvement | ECCV 2020
- 微信小程序相关
- Looking for better dynamic getter and setter solutions
- Dynamic ReLU:微软推出提点神器,可能是最好的ReLU改进 | ECCV 2020
- 动态规划设计:最大子数组
- 趣文分享:C 语言和 C++、C# 的区别在什么地方?
- C / C + + learning diary: original code, inverse code and complement code
- git操作与分支管理规范
- 简明 VIM 练级攻略
猜你喜欢
随机推荐
Part 1 - Chapter 2 pointer operation
如果把编程语言当武功绝学!C++是九阴真经,那程序员呢?
How much disk IO does a byte of read file actually take place?
. net core cross platform resource monitoring library and dotnet tool
I used Python to find out all the people who deleted my wechat and deleted them automatically
How to deploy pytorch lightning model to production
IT行业薪资一直遥遥领先!十年后的程序员,是否还是一个高薪职业?
Not a programmer, code can't be too ugly! The official writing standard of Python: pep8 everyone should know
实验
Dynamic relu: Microsoft's refreshing device may be the best relu improvement | ECCV 2020
趣文分享:C 语言和 C++、C# 的区别在什么地方?
Iptables from introduction to mastery
experiment
VirtualBox install centos7
Mongodb database
Implementation of warehouse management system with ABP (net core) + easyUI + efcore
Django之简易用户系统(3)
Newbe.ObjectVisitor 样例 1
AI perfume is coming. Will you buy it?
Wechat applet related