当前位置:网站首页>Newbe.ObjectVisitor 样例 1
Newbe.ObjectVisitor 样例 1
2020-11-08 20:18:00 【Newbe36524】
我们增加了一些可以使用该库实现功能的场景和做法说明。
将数据库链接字符串转型为数据模型,或者将数据模型格式化为链接字符串。
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;
}
}
}
} |
将对象中满足手机号码格式的字段替换为密文,避免敏感信息输出。
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!;
}
}
} |
将实现了 IEnumerable<int>
的所有属性求和。
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!;
}
}
} |
发布说明
使用样例
番外分享
GitHub 项目地址:https://github.com/newbe36524/Newbe.ObjectVisitor
Gitee 项目地址:https://gitee.com/yks/Newbe.ObjectVisitor
- 本文作者: newbe36524
- 本文链接: https://www.newbe.pro/Newbe.ObjectVisitor/Example-1/
- 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
版权声明
本文为[Newbe36524]所创,转载请带上原文链接,感谢
https://my.oschina.net/newbe36524/blog/4708321
边栏推荐
- How to deploy pytorch lightning model to production
- Chapter 2 programming exercises
- Flink series (0) -- Preparation (basic stream processing)
- One minute comprehensive understanding of forsage smart contract global shared Ethereum matrix plan
- I used Python to find out all the people who deleted my wechat and deleted them automatically
- When to write disk IO after one byte of write file
- PAT_ Grade A_ 1056 Mice and Rice
- c++ opencv4.3 sift匹配
- 实验
- 精通高并发与多线程,却不会用ThreadLocal?
猜你喜欢
Your random IO hard disk
寻找性能更优秀的动态 Getter 和 Setter 方案
都说程序员钱多空少,程序员真的忙到没时间回信息了吗?
Solution to cross domain problem of front end separation
Using fastai to develop and deploy image classifier application
AI perfume is coming. Will you buy it?
Iptables from introduction to mastery
Dynamic programming: maximum subarray
[elastic search technology sharing] - ten pictures to show you the principle of ES! Understand why to say: ES is quasi real time!
给大家介绍下,这是我的流程图软件 —— draw.io
随机推荐
I used Python to find out all the people who deleted my wechat and deleted them automatically
动态规划答疑篇
Process thread coroutine
python开发qt程序读取图片的简单流程
MongoDB数据库
选择排序
Django之简易用户系统(3)
PAT_ Grade A_ 1056 Mice and Rice
Suffix expression to infix expression
存储过程动态查询处理方法
Exercise 5
都说程序员钱多空少,程序员真的忙到没时间回信息了吗?
Using fastai to develop and deploy image classifier application
c++ opencv4.3 sift匹配
EntityFramework Core上下文实例池原理分析
C / C + + knowledge sharing: function pointer and pointer function, can you understand after reading this article?
net.sf.json.JSONObject对时间戳的格式化处理
线程池运用不当的一次线上事故
experiment
VirtualBox install centos7