C# 反射(?)-检查类中每个属性/字段是否为null或空?

C# 反射(?)-检查类中每个属性/字段是否为null或空?,c#,.net,reflection,C#,.net,Reflection,我有一个简单的类: public class FilterParams { public string MeetingId { get; set; } public int? ClientId { get; set; } public string CustNum { get; set; } public int AttendedAsFavor { get; set; } public int Rating { get; set; } public

我有一个简单的类:

public class FilterParams
{
    public string MeetingId { get; set; }
    public int? ClientId { get; set; }
    public string CustNum { get; set; }
    public int AttendedAsFavor { get; set; }
    public int Rating { get; set; }
    public string Comments { get; set; }
    public int Delete { get; set; }
}
如何检查类中的每个属性,如果它们不是null(int)或empty/null(对于string),那么我将转换该属性的值并将其添加到
列表中


谢谢。

这不是最好的方法,但大致上:

假设
obj
是您的类的实例:

Type type = typeof(FilterParams);


foreach(PropertyInfo pi in type.GetProperties())
{
  object value = pi.GetValue(obj, null);

  if(value != null && !string.IsNullOrEmpty(value.ToString()))
     // do something
}
下面是一个例子:

foreach (PropertyInfo item in typeof(FilterParams).GetProperties()) {
    if (item != null && !String.IsNullOrEmpty(item.ToString()) {
        //add to list, etc
     } 
}

您可以使用LINQ来实现这一点:

List<string> values
    = typeof(FilterParams).GetProperties()
                          .Select(prop => prop.GetValue(yourObject, null))
                          .Where(val => val != null)
                          .Select(val => val.ToString())
                          .Where(str => str.Length > 0)
                          .ToList();
列出值
=typeof(FilterParams).GetProperties()
.Select(prop=>prop.GetValue(yourObject,null))
.Where(val=>val!=null)
.Select(val=>val.ToString())
.Where(str=>str.Length>0)
.ToList();

您真的需要反射吗?实现类似于
bool IsNull是否适合你?您可以将其封装在像INullableEntity这样的接口中,并在每个需要此类功能的类中实现,显然,如果有很多类,您可能必须坚持使用反射。

如果您没有很多此类类,也没有太多属性,最简单的解决方案可能是编写检查和转换每个属性的

public class FilterParams
{
    // ...

    public IEnumerable<string> GetValues()
    {
        if (MeetingId != null) yield return MeetingId;
        if (ClientId.HasValue) yield return ClientId.Value.ToString();
        // ...
        if (Rating != 0)       yield return Rating.ToString();
        // ...
    }
}
公共类过滤器参数
{
// ...
公共IEnumerable GetValues()
{
如果(MeetingId!=null)返回MeetingId;
if(ClientId.HasValue)返回ClientId.Value.ToString();
// ...
如果(评级!=0)收益率返回评级.ToString();
// ...
}
}
用法:

FilterParams FilterParams=。。。
列表值=filterParams.GetValues().ToList();

不执行
prop.GetValue
返回
null
如果属性的类型为
int
且值为
0
?@dtb,不,在这种情况下,它将返回
0
。@Frederic:你想包含0还是过滤掉它们?@James,我想包含它们,很显然,提问者是这么做的。很抱歉,这有点过时了,但是如果我想检查short,int,long是否等于0呢?查询将是什么样的。。。我拼凑了一些代码,但坦率地说,它看起来很难看。我认为对于值对象空检查。需要检查And(&&)条件而不是OR(| |)
public class FilterParams
{
    // ...

    public IEnumerable<string> GetValues()
    {
        if (MeetingId != null) yield return MeetingId;
        if (ClientId.HasValue) yield return ClientId.Value.ToString();
        // ...
        if (Rating != 0)       yield return Rating.ToString();
        // ...
    }
}
FilterParams filterParams = ...

List<string> values = filterParams.GetValues().ToList();