簡體   English   中英

如何檢查類成員是否為空或空

[英]How check whether class members are not null or empty

我有一個只有這樣的字符串成員的類:

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

我創建了一個實例:

Var myClass = new MyClass();

稍后在代碼中,我想知道所有成員(MyProp1和MyProp2)是否為空或空。 我知道我可以使用if當然但在我的實際代碼中有更多屬性而不是2。

有沒有辦法做到這一點 ?

謝謝,

為您的屬性使用基於字典的存儲可能是最簡單的方法:

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);
    }
}

您可以嘗試使用反射來檢查屬性。 您應該確認所有屬性都是公共的,類型是字符串。 這是代碼。

    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;
    }

要檢查您的類是否包含null的“any”屬性:

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

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

您可以隨時初始化您的課程

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();
}

如果類中有許多屬性,則處理此屬性的一種方法是將它們存儲在集合(如數組或字典)中,而不是將每個屬性聲明為類的單獨成員。

然后,您可以按鍵訪問字典中的數據,這與訪問類的屬性一樣簡單。 而且優點是你可以遍歷字典並檢查循環中的所有屬性。

我建議在你的類中創建一個函數,在那里檢查所有屬性的String.IsNullOrEmpty(MyProp1)等。 這樣你至少可以在一個地方收集所有的ckecking功能。 只要添加新屬性,您就只能修改此位置。

通過使用Attribute Base編程,您可以實現此目的。 在這種方法中,您需要將屬性放在類成員上,並且可以進行驗證。 您也可以使用Microsoft Enterprise Library

要檢查是否已設置所有元素,可以在類中添加一個IsEmpty()方法來檢查內部屬性。 然后,您不必通過代碼在任何地方復制if語句。

IsEmpty()方法中,您可以使用常規if語句檢查所有字段,也可以使用反射自動檢索所有字符串屬性並檢查其值。 如果檢查,反射的性能將比正常情況更糟,但如果這不是問題,您可以在所有實體中重復使用反射代碼來檢查它們的值。

可能最好的方法是:

以字符串字典的形式重構您的屬性。 循環遍歷字典以使用string.IsNullOrEmpty()測試字符串。 你可以用一個Indexer屬性替換N getter / setter,它根據一個鍵直接從字典中設置和檢索字符串

您可以嘗試使用以下樣式。 我之前沒有嘗試過,但你可能會看到它是否有幫助

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM