2012-01-05 97 views
3

我只用字符串成員一類是這樣的:如何檢查類成員是否不爲空或空

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

我創建一個實例:

Var myClass = new MyClass(); 

稍後在代碼中,我d想知道所有成員(MyProp1和MyProp2)是否爲空或空。我知道我當然可以使用if,但是在我的真實代碼中有更多的屬性超過2。

有沒有辦法做到這一點?

謝謝,

+0

你需要知道哪些屬性爲null或的String.Empty或只是其中至少有一個是? – ChrisBD 2012-01-05 08:25:55

+0

屬性不能爲空,不能爲空 – 2012-01-05 08:28:29

回答

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

請注意:在您的代碼中,如果您沒有設置第一個參數,您將調用'MyProp1',將會得到'System.Collections.Generic.KeyNotFoundException!至少使用'get {return _store.ContainsKey(「MyProp1」)? _store [「MyProp1」]:String.Empty; }' – balexandre 2012-01-05 08:51:39

+0

@balexandre:好點,我已經用你的建議更新了答案。 – Pondidum 2012-01-05 09:03:07

+2

與默認實例比較:極好的想法。 – 2012-12-20 14:27:00

0

如果在類許多性質,處理的一種方式是將它們存儲在集合中,諸如數組或字典,代替聲明每個屬性爲一體的一個單獨的構件類。

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

0

我會建議在你的班級中創建一個功能,你可以檢查String.IsNullOrEmpty(MyProp1)等所有你的屬性。這樣你至少可以在一個地方收集所有的Ckecking功能。而且,只要添加新屬性,您就只能修改這個位置。

+0

這只是我不想做......一個 – 2012-01-05 08:15:50

+0

檢查一個除非你想在類中創建遍歷所有成員的功能(例如,如這裏http://stackoverflow.com/questions/721441/c-sharp-how-to-iterate-through-classes-fields-and-set-properties描述),你必須這樣做以某種方式。只要你爲它創建一個函數,你只需要做一次...反射是一個更通用的解決方案,創建你自己的函數手動檢查每個屬性產生更好的性能(並給你更多的控制)。 – Nailuj 2012-01-05 08:17:47

0

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

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);並且在輔助我檢查它是否爲空,其他任何檢查,我可以很容易地tweek輔助方法,這將是提供給所有的元素,你可以擴展它不僅支持字符串,但是所有其他數據類型以及

所以,想象一下,你是從你的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(); 
} 
+0

我的解釋是不好。通過讀取XML文件來設置成員,但我想確保所有成員都不爲空或空 – 2012-01-05 08:19:34

+0

我在這些情況下做的是調用助手,例如:'string name = myHelper.CheckNode(xmlNode) ;'和那個幫助程序中,我檢查它是否爲null,任何其他檢查,我可以輕鬆地調用幫助器方法,它將適用於所有元素,並且可以將其擴展爲不僅支持字符串,還支持其他所有元素數據類型也是如此。 – balexandre 2012-01-05 08:22:44

+0

爲我的解釋添加了代碼... – balexandre 2012-01-05 08:34:41

0

要檢查所有的元素都設置您可以添加一個IsEmpty()方法到類,將檢查內部屬性。那麼你就不需要在你的代碼中遍歷所有if語句。

在您的IsEmpty()方法中,您可以使用常規if語句來檢查所有字段,或者您可以使用反射來自動檢索所有字符串屬性並檢查其值。反射的性能會差那麼一個正常的,如果檢查,但如果這不是一個問題,你可以重複使用所有的實體反射代碼來檢查它們的值。

-1

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

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

也許最好的辦法是:

以字符串字典的形式重構您的屬性。循環訪問字典以使用string.IsNullOrEmpty()來測試字符串。您可以通過它設置,並直接從基於鍵

4

你可以嘗試使用反射來檢查屬性的字典檢索串一個索引屬性替換N個的getter/setter方法。您應該確認所有屬性都是公共的,並且類型是字符串。這是代碼。

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

任何框架都爲我們做這項工作? Nunit?或moq?還是應該由用戶檢查? ?? – 2014-03-28 10:10:09

2

要檢查,如果你的類包含「任何」性能,這是空:

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

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