我有一个只有字符串成员的类:
public class MyClass
{
public string MyProp1 { get; set; }
public string MyProp2 { get; set; }
}
我创建了一个实例:
Var myClass = new MyClass();
稍后在代码中,我想知道所有成员(MyProp1和MyProp2)是否为空或空。我知道我当然可以使用if
,但在我的实际代码中有更多属性而不是2。
有办法做到这一点吗?
谢谢,
答案 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))