【发布时间】:2020-11-19 10:11:49
【问题描述】:
我有一个对象,它包含一些 int/string 属性和一些 List
我尝试搜索它,但找不到简洁明了的方法。我应该选择反思吗?有人可以提供与此相关的示例吗?
public class A
{
..some properties..
List<ClassA> ListA { get; set; }
List<ClassB> ListB { get; set; }
List<ClassC> ListC { get; set; }
List<ClassD> ListD { get; set; }
..some properties..
}
编辑 1: 到目前为止,我已经设法编写了一个干净的代码来检查列表属性是否为空。但是我如何检查它们是否为空。我需要将对象转换为 List,但我不知道 List 的类型
var matchFound = myObject.GetType().GetProperties()
.Where(x => x.PropertyType == typeof(List<>))
.Select(x => x.GetValue(myObject))
.Any(x => x != null);
编辑 2: 我最终使用了这个,一个工作正常的衬里:
var matchFound = myObject.GetType().GetProperties()
.Where(x =>(x.GetValue(myObject) as IList)?.Count()>0);
【问题讨论】:
-
List<T>.TrueForAll 方法应该可以。
-
我的要求是我有一个上述类的对象。有很多列表,所以我不想单独检查 ListA 是否为空,然后 ListB 是否为空等等....是否可以通过 linq 或反射实现??
-
尝试考虑使用反射递归遍历所有属性 - stackoverflow.com/questions/20554103/…
-
@ChrisRollins:我看不出
TrueForAll在这里有什么用——列表本身只被检查为空(或空引用)。这不需要检查列表的任何元素。 -
请注意,
.Where(x => x.PropertyType == typeof(List<>))永远不会找到任何属性。属性不会是List<>类型,因为那是开放的泛型类型。您需要检测该属性的类型是从List<>构造的类型。
标签: c#