我正在构建一个使用List<T>
并将其转换为DataTabe
的方法。在此过程中,我想过滤掉所有带有[NotMapped]
属性标记的属性。
我可以使用整个方法,但是我担心其中的一部分……淘汰[NotMapped]
属性的那一部分。这就是我所拥有的:
public static DataTable CreateDataTable<T>(IEnumerable<T> list)
{
Type type = typeof(T);
var properties = type.GetProperties().Where(p =>
p.CustomAttributes.ToList().Count == 0 ||
(p.CustomAttributes.ToList().Count > 0 && p.CustomAttributes.ToList()[0].AttributeType.Name != "NotMappedAttribute")
).ToList();
// Rest of the method...
}
因此,它可以按我的意愿工作,并且摆脱了任何看起来像这样的东西,例如,所以它不会出现在最后的DataTable
中:
[NotMapped]
public string Description { get; set; }
我关心的是性能,只是一般的最佳实践。 var properties =
LINQ查询对我来说似乎很笨拙,但是我没有看到更有效的方法来对其进行改进。
也就是说,我不喜欢拨打p.CustomAttributes.ToList()
3次。有办法避免这种情况吗?
答案 0 :(得分:3)
let rect: CGRect = CGRect(x: 0, y: -25, width: size.width, height: size.height)
答案 1 :(得分:0)
要回答原始问题,可以通过保存其返回值来避免多次调用ToList()
:
type.GetProperties().Where(p =>
p.CustomAttributes.ToList().Count == 0 ||
(p.CustomAttributes.ToList().Count > 0 && p.CustomAttributes.ToList()[0].AttributeType.Name != "NotMappedAttribute")
)
...变成...
type.GetProperties().Where(p =>
{
var attrs = p.CustomAttributes.List();
return attrs.Count == 0 || (attrs.Count > 0 && attrs[0].AttributeType.Name != "NotMappedAttribute");
})
但是,我建议您这样做:
type.GetProperties().Where(p => p.GetCustomAttribute<NotMappedAttribute>() == null))
它更短,更容易一目了然。