Newbe.ObjectVisitor 0.2.10 发布,更花里胡哨
更新内容
//✔️ from 0.2
// 可以修改属性
o.V().ForEach((context) => ModifyData(context)).Run();
public static void ModifyData(IObjectVisitorContext context)
{
context.Value = context.Value.SubString(0,1);
}
// ✔️ from 0.2
// 多重 foreach
o.V().ForEach((context)=>{}).ForEach((context)=>{}).Run();
//✔️ from 0.2
// 遍历指定类型的属性
o.V().ForEach((context) => {});
// 和上一条完全一样
o.V().ForEach((context) => {}, x => x.PropertyType == typeof(string));
// 遍历被标记了 RequiredAttribute 的 string 属性
o.V().ForEach((context) => {}, x => x.PropertyType == typeof(string) && x.GetCustomAttribute());
// 遍历“是”或者实现了 IEnumerable 接口的属性, 例如 List, int[], IEnumerable, HashSet 等等。
o.V().ForEach>((context) => {}, x => x.IsOrImplOf>());
// 指定属性类型,并包含一个扩展的参数
o.V().WithExtendObject().ForEach((context) => {});
基准测试


文章
场景样例
将数据库链接字符串转型为数据模型,或者将数据模型格式化为链接字符串。
将对象中满足手机号码格式的字段替换为密文,避免敏感信息输出。
将实现了 的所有属性求和。
简要说明
var order = new OrderInfo();
for(var pInfo in typeof(OrderInfo).GetProperties())
{
Console.Writeline($"{pInfo.Name}: {pInfo.GetValue(order)}");
}
// call .V what is a static extension method
// you get a visitor object for order
var visitor = order.V();
visitor.ForEach(context=>{
var name = context.Name;
var value = context.Value;
Console.Writeline($"{name}: {value}");
}).Run();
// you can also make it into one line
order.V().ForEach(c=> Console.Writeline($"{c.Name}: {c.Value}")).Run();
// or using quick style
order.FormatToString();
那我为什么要这样做?
因为这样更可读!通过这个类库你可以使用链式API和命名方法来创建一个委托,这样可以让你的代码实现和硬编码同样的可读效果。
因为这样更具扩展性!如果使用了这个类库,你就拥有了一个简便的方法来访问一个类所有的属性。因此,你就做很多你想做的事情,比如:创建一个验证器来验证你的模型,修改一些可能包含敏感数据的属性从而避免输出到日志中,创建一个类似于AutoMapper的对象映射器但是拥有更好的性能,诸如此类。