2 回答
TA贡献1898条经验 获得超8个赞
出于某种原因,当 LINQ 语法实际上非常有用并且使意图非常清晰时,它似乎被避免了。
用 LINQ 语法重写,以下适用 @DavidG 的优点。
private static IReadOnlyList<Weight> ExtractWeights(Type type)
{
return (from p in type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
let attr = p.GetCustomAttribute<WeightAttribute>()
where attr != null
select attr.Weight).ToArray();
}
当查询变得更加复杂时,例如需要测试整个方法签名的这个let
(完全公开:我的答案),渐进式过滤很容易遵循,并且沿途发现的事实在子句中高度可见。
TA贡献1744条经验 获得超4个赞
通过使用空条件运算符并将空检查作为最后一件事,您可以避免再次获取自定义属性:
private static IReadOnlyList<Weight> ExtractWeights(Type type)
{
return type
.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly)
.Select(x => x.GetCustomAttribute<WeightAttribute>()?.Weight)
.Where(x => x!= null)
.ToArray();
}
完整示例:https ://dotnetfiddle.net/fbp50c
- 2 回答
- 0 关注
- 89 浏览
添加回答
举报