C# 如何检查类的所有属性是否为null或空?

C# 如何检查类的所有属性是否为null或空?,c#,C#,我需要一个方法来检查所有类属性的null值,如果只有一个属性为null,则返回false。大概是这样的: public static bool Check<T>(T instance) { foreach (var parameter in instance) { if (parameter == null) return false; } return true; } 长话短说。这有点复杂。你可以找到你的答

我需要一个方法来检查所有类属性的null值,如果只有一个属性为null,则返回false。大概是这样的:

public static bool Check<T>(T instance)
{
    foreach (var parameter in instance)
    {
        if (parameter == null)
            return false;
    }

    return true;
}
长话短说。这有点复杂。

你可以找到你的答案,它可能会帮助你

其中指出:

 bool IsAnyNullOrEmpty(object myObject)
 {
     foreach(PropertyInfo pi in myObject.GetType().GetProperties())
     {
         string value = (string)pi.GetValue(myObject);
         if(String.IsNullOrEmpty(value))
         {
             return false;
         }
     }
     return true;
 }
你可以找到你的答案,它可能会帮助你

其中指出:

 bool IsAnyNullOrEmpty(object myObject)
 {
     foreach(PropertyInfo pi in myObject.GetType().GetProperties())
     {
         string value = (string)pi.GetValue(myObject);
         if(String.IsNullOrEmpty(value))
         {
             return false;
         }
     }
     return true;
 }
类似这样的内容(检查null,注意,非字符串属性可以为空):

//您不需要泛型,对象就足够了
公共静态布尔检查(对象实例){
//或false,或抛出异常
if(Object.ReferenceEquals(null,instance))
返回true;
//TODO:精心设计-您需要公共和非公共属性吗?静态属性?
var properties=instance.GetType().GetProperties(
BindingFlags.Instance|
BindingFlags.Static|
BindingFlags.Public|
BindingFlags(非公开);
foreach(属性中的var属性){
如果(!prop.CanRead)/类似于以下内容(检查null,注意,非字符串属性可以为空):

//您不需要泛型,对象就足够了
公共静态布尔检查(对象实例){
//或false,或抛出异常
if(Object.ReferenceEquals(null,instance))
返回true;
//TODO:精心设计-您需要公共和非公共属性吗?静态属性?
var properties=instance.GetType().GetProperties(
BindingFlags.Instance|
BindingFlags.Static|
BindingFlags.Public|
BindingFlags(非公开);
foreach(属性中的var属性){


if(!prop.CanRead)//当你说类参数时,你是指属性吗?如果是,请看一下反射-尤其是
Type.GetProperties
。这不是一个重复的问题!!!。我已经看到了这一点,不同的是我的类属性有不同的类型(string、int、double…)一个
int
和一个
double
无论如何都不能为null,所以你可能需要为它添加一个过滤器,但对我来说它看起来确实像是一个副本。不幸的是,在我的例子中,甚至int和double都可以为null。类是web服务输入,我无法对其进行过滤。不,
int
double
值永远不能为null。试试看:
intx=null;
Nope,这不会编译。它们可能是0(或0.0)但不能为空。在进一步讨论之前,了解这一点很重要。当你说类参数时,你是指属性吗?如果是,请看一看反射-尤其是
Type.GetProperties
。这不是一个重复的问题!!!。我已经看到了这一点,不同的是我的类属性有不同的类型(字符串、整数、双精度…)一个
int
和一个
double
无论如何都不能为null,所以你可能需要为它添加一个过滤器,但对我来说它看起来确实像是一个副本。不幸的是,在我的例子中,甚至int和double都可以为null。类是web服务输入,我无法对其进行过滤。不,
int
double
值永远不能为null。试试看:
intx=null;
Nope,这不会编译。它们可能是0(或0.0)但不能为空。在进一步讨论之前,您必须了解这一点。您应该添加一条带有该答案链接的注释,而不是从中复制/粘贴代码。@MarcinJuraszek我认为复制和粘贴代码并不坏。因为如果链接页面发生更改,链接答案可能会变得无效,这会让用户感到沮丧我正在搜索答案以从一个链接移动到另一个链接。是的,我之前也做了同样的操作,只放了一个链接,有人建议(可能是某某的专家)我把答案和代码放在一起,因为答案可以在我们放在这里作为链接后编辑,提问者可能会分心。把链接放在这里很好(这样你就可以确定这个问题是重复的)以及答案(这样你就可以最早找到答案),不知何故,现在我开始投票了:(您应该添加一条带有该答案链接的注释,而不是从中复制/粘贴代码。@MarcinJuraszek我认为复制和粘贴代码并不坏。因为链接页面发生变化时,链接答案可能会变得无效,用户在搜索答案时从一个链接移动到另一个链接会感到沮丧。是的,我也这样做了。)rlier,只放链接,有人建议(可能是某个专家)我把它放在答案上,也放在代码上,因为在我们放在这里作为链接后,答案可以编辑,提问者可能会分心。最好放在这里链接(这样可以识别问题重复)和答案(这样可以尽早找到答案)不知怎的,现在我的投票被否决了:(非常感谢亲爱的@Dimitry。但它确实有效吗?我用一个空值的类进行了测试,但它返回true!@Dan:你能提供一个测试类的例子吗?@Dan:看,你根本没有属性:只有字段。属性看起来是这样的:
公共字符串数量{get;set;}
,而字段是这样的:
public String Amount;
非常感谢。老实说,我不认为这有什么关系!!。还有一个问题,如果我的一些类有字段,而另一些类有属性?@Dan:嗯,你可以将这两个方法结合起来(将它们重命名为CheckProperties和CheckFields),例如,检查字段,然后检查属性。非常感谢亲爱的@Dimitry。但它确实有效吗?我用一个空值的类进行了测试,但返回true!@Dan:你能提供一个测试类的示例吗?@Dan:看,你根本没有属性:仅字段。属性看起来像:
公共字符串数量{get;set;}
,而字段是这样的:
public String Amount;
非常感谢。老实说,我不认为这有什么关系!!。还有一个问题,如果我的一些类有字段,而另一些类有属性?@Dan:嗯,你可以将这两个方法结合起来(将它们重命名为CheckProperties和CheckFields),例如,检查字段,然后检查属性。
// You don't need generic, Object is quite enough 
public static bool Check(Object instance) {
  // Or false, or throw an exception
  if (Object.ReferenceEquals(null, instance))
    return true;

  //TODO: elaborate - do you need public as well as non public properties? Static ones?
  var properties = instance.GetType().GetProperties(
    BindingFlags.Instance | 
    BindingFlags.Static | 
    BindingFlags.Public | 
    BindingFlags.NonPublic);

  foreach (var prop in properties) {
    if (!prop.CanRead) // <- exotic write-only properties
      continue;
    else if (prop.PropertyType.IsValueType) // value type can't be null
      continue;

    Object value = prop.GetValue(prop.GetGetMethod().IsStatic ? null : instance);

    if (Object.ReferenceEquals(null, value))
      return false;

    //TODO: if you don't need check STRING properties for being empty, comment out this fragment
    String str = value as String; 

    if (null != str)
      if (str.Equals(""))
        return false;
  }

  return true;
}
// You don't need generic, Object is quite enough 
public static bool Check(Object instance) {
  // Or false, or throw an exception
  if (Object.ReferenceEquals(null, instance))
    return true;

  //TODO: elaborate - do you need public as well as non public field/properties? Static ones? 
  BindingFlags binding =
    BindingFlags.Instance |
    BindingFlags.Static |
    BindingFlags.Public |
    BindingFlags.NonPublic;

  // Fields are easier to check, let them be first
  var fields = instance.GetType().GetFields(binding);

  foreach (var field in fields) {
    if (field.FieldType.IsValueType) // value type can't be null
      continue;

    Object value = field.GetValue(field.IsStatic ? null : instance);

    if (Object.ReferenceEquals(null, value))
      return false;

    //TODO: if you don't need check STRING fields for being empty, comment out this fragment
    String str = value as String;

    if (null != str)
      if (str.Equals(""))
        return false;

    // Extra condition: if field is of "WS_IN_" type, test deep:
    if (field.FieldType.Name.StartsWith("WS_IN_", StringComparison.OrdinalIgnoreCase))  
      if (!Check(value))
        return false; 
  }

  // No null fields are found, let's see the properties
  var properties = instance.GetType().GetProperties(binding);

  foreach (var prop in properties) {
    if (!prop.CanRead) // <- exotic write-only properties
      continue;
    else if (prop.PropertyType.IsValueType) // value type can't be null
      continue;

    Object value = prop.GetValue(prop.GetGetMethod().IsStatic ? null : instance);

    if (Object.ReferenceEquals(null, value))
      return false;

    //TODO: if you don't need check STRING properties for being empty, comment out this fragment
    String str = value as String;

    if (null != str)
      if (str.Equals(""))
        return false;
  }

  return true;
}