如何检查类成员是否为空或空

时间:2012-01-05 08:10:19

标签: c#

我有一个只有字符串成员的类:

public class MyClass
{
    public string MyProp1 { get; set; }
    public string MyProp2 { get; set; }
}

我创建了一个实例:

Var myClass = new MyClass();

稍后在代码中,我想知道所有成员(MyProp1和MyProp2)是否为空或空。我知道我当然可以使用if,但在我的实际代码中有更多属性而不是2。

有办法做到这一点吗?

谢谢,

10 个答案:

答案 0 :(得分:10)

为您的属性使用基于字典的商店可能是最简单的方法:

public class MyClass
{
    private IDictionary<String, String> _store;

    public MyClass()
    {
        _store = new Dictionary<String, String>();
    }

    public string MyProp1 { 
        get { return GetOrDefault("MyProp1"); }
        set { _store["MyProp1"] = value; }
    }
    public string MyProp2 { 
        get { return GetOrDefault("MyProp2"); }
        set { _store["MyProp2"] = value; }
    }

    public Boolean HasData()
    {
        return _store.Any(x => !String.IsNullOrWhiteSpace(x.Value));
    }

    public Boolean IsEmpty()
    {
        return _store.All(x => String.IsNullOrWhiteSpace(x.Value));
    }   

    private String GetOrDefault(String propertyName)
    {
        if (_store.ContainsKey(propertyName))
        {
            return _store[propertyName];
        }

        return String.Empty;
    }
}

执行此操作的另一种方法是将其与默认实例进行比较:

public class MyClass
{
    public string MyProp1 { get; set; }
    public string MyProp2 { get; set; }

    public static readonly MyClass Empty = new MyClass();

    public Boolean HasData()
    {
        return !Empty.Equals(this);
    }

    public Boolean IsEmpty()
    {
        return Empty.Equals(this);
    }
}

答案 1 :(得分:5)

您可以尝试使用反射来检查属性。您应该确认所有属性都是公共的,类型是字符串。这是代码。

    public static bool IsNullOrEmpty(MyClass prop)
    {
        bool result = true;

        PropertyInfo[] ps = prop.GetType().GetProperties();

        foreach (PropertyInfo pi in ps)
        {
            string value = pi.GetValue(prop, null).ToString();

            if (string.IsNullOrEmpty(value))
            {
                result = false;
                break;
            }
        }

        return result;
    }

答案 2 :(得分:2)

检查您的类是否包含'any'属性为null:

System.Reflection.PropertyInfo[] properties = myClass.GetType().GetProperties
                         (BindingFlags.Public | BindingFlags.Instance);         

bool hasNullProperty = properties.Any(y => y.GetValue(x, null) == null);

答案 3 :(得分:1)

您可以随时初始化您的课程,例如

public class MyClass
{
    public MyClass() {
        this.MyProp1 = this.MyProp2 = String.Empty;
    }

    public string MyProp1 { get; set; }
    public string MyProp2 { get; set; }
}

并且,除非您以编程方式为其分配null值,否则new MyClass()将在其2个属性中始终拥有String.Empty ...


来自评论:

  

在这些情况下我做的是调用助手,例如:string name = myHelper.CheckNode(xmlNode);并且在那个帮助器中我检查它是否为空,任何其他检查,我可以轻松地调整辅助方法并且它将可用于所有元素,并且您可以扩展它以支持不仅字符串而且还支持所有其他数据类型

因此,假设您正在从XML中读取节点,您可以将它们写成:

string name = myHelper.CheckNode(node);

在你的助手中,你可以有类似的东西:

XmlNodeList datasourceNodes = rootNode.SelectNodes("dataSources/dataSource");
foreach (XmlNode datasourceNode in datasourceNodes)
{
    DataSource dataSource = new DataSource();
    dataSource.Name = myHelper.CheckAttr(datasourceNode.Attributes["name"]);
    dataSource.ODBC = myHelper.CheckNode(datasourceNode.SelectSingleNode("odbc"));

    // or a variant (Extension Method)
    dataSource.UID  = datasourceNode.CheckNode("user");
    dataSource.PWD  = datasourceNode.CheckAttr("password");

    ds.Add(dataSource);
}
然后,您的助手可以使用以下方法:

public static string CheckAttr(XmlAttribute attr) 
{
    return attr == null ? "" : attr.Value.Trim();
}
public static string CheckNode(XmlNode node) 
{
    return node == null ? "" : node.InnerText.Trim();
}

或变体(扩展方法)

public static string CheckAttr(this XmlNode, string attrName)
{
    return attrName[attrName] == null ? "" : attrName[attrName].Value.Trim();
}
public static string CheckNode(this XmlNode, string nodeName)
{
    return node.SelectSingleNode(nodeName) == null ? 
                 "" : 
                 node.SelectSingleNode(nodeName).InnerText.Trim();
}

答案 4 :(得分:0)

如果类中有许多属性,处理它的一种方法是将它们存储在一个集合中,例如数组或字典,而不是将每个属性声明为该类的单独成员。

然后,您可以通过键访问字典中的数据,这就像访问类的属性一样简单。而且优点是你可以遍历字典并检查循环中的所有属性。

答案 5 :(得分:0)

我建议您在班级中创建一个功能,检查String.IsNullOrEmpty(MyProp1)等所有属性。这样你至少可以在一个地方收集所有的ckecking功能。只要添加新属性,您就只能修改此位置。

答案 6 :(得分:0)

通过使用属性库编程,您可以实现此目的。在这种方法中,您需要将属性放在类成员上,并且可以进行验证。您也可以使用Microsoft Enterprise Library

答案 7 :(得分:0)

要检查是否已设置所有元素,您可以在类中添加IsEmpty()方法来检查内部属性。然后,您不必通过代码在任何地方复制if语句。

IsEmpty()方法中,您可以使用常规if语句检查所有字段,也可以使用反射自动检索所有字符串属性并检查其值。如果检查,反射的性能将比正常情况更糟,但如果这不是问题,您可以在所有实体中重复使用反射代码来检查它们的值。

答案 8 :(得分:0)

可能最好的方法是:

以字符串字典的形式重构您的属性。循环遍历字典以使用string.IsNullOrEmpty()测试字符串。您可以通过单个Indexer属性替换N getter / setter,该属性根据键直接从字典设置和检索字符串

答案 9 :(得分:-1)

您可以尝试使用以下样式。我之前没有尝试过,但你可能会看到它是否有帮助

If (String.IsNullOrEmpty(string1 && string2 && string3))