[英]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.