0x04-过滤属性
我们已经掌握了 ForEach 的完整用法,现在我们来进一步了解一下如何按照需求来“过滤属性”。
所谓“过滤属性”,是指在创建 object visitor 过程中跳过那些不满足条件的属性。
ForEach 的重载一共分为泛型和非泛型两个版本。这两者的过滤方式存在一定区别。
ForEach 非泛型方式属性过滤
首先是最简单的重载形式:
ForEach(Expression<Action<string, object>> foreachAction)
有两种方式对其进行过滤:
- 调用扩展方法
ForEach(Expression<Action<string, object>> foreachAction, Func<PropertyInfo, bool>? propertyInfoFilter) - 使用 FluentAPI
FilterProperty(Func<PropertyInfo, bool>? propertyInfoFilter).ForEach(Expression<Action<string, object>> foreachAction)
这两种方式得到的结果完全一样。我们以 FluentAPI 的方式举例说明:
所有的属性都将被访问。这也是未指定的 filter 时的默认行为。
FilterProperty(p => true).ForEach((name, value) => _ )
Name 为 "P_" 开头的属性才会被访问。
FilterProperty(p => p.Name.StartWith("P_")).ForEach((name, value) => _ )
只有string类型的属性才会被访问。
FilterProperty(p => p.PropertyType == typeof(string)).ForEach((name, value) => _ )
属性被标记为 RequiredAttribute 才会被访问
FilterProperty(p => p.GetCustomAttribute<RequiredAttribute>() != null ).ForEach((name, value) => _ )
另外还有一些小的注意点:
- 同一个
ForEach下FilterProperty