我有一个班级
class A {
propA { get; set; }
propB { get; set; }
propC { get; set; }
target { get; set; }
}
我计算出A类的目标,并用用户输入填充该类。 每个不同的目标都意味着需要不同类的属性(不是空/ null)。
因此,如果我的目标是香蕉,那么propA和propB不能为空。如果是apple,那么propB和propC一定不能为空。我需要在应用程序启动时执行此操作,以便不在后续阶段进行检查,因为某些方法和数据库调用将需要数据等。
编码此代码的最佳方法是什么?甚至是设计明智的。 在枚举中存储每个目标所需的属性是一种好的做法吗?然后使用下面提供的lazyberezovsky来检查??
上面的例子只有3个属性,但我实际需要做的事情还有更多。
我才开始研究验证代码的方法。
总之,这个问题有两个部分。 - 如何检查类的属性是否为空 - 在某处使用不同的组合所需属性的列表来存储如何检查
编辑:对不起!我已经编辑过,希望能更好地理解这一点。答案 0 :(得分:2)
让我试着猜猜是什么问题:)
这是类型验证器,它可以检查参数的公共属性是否存在:
public class TypeValidator<T>
{
public bool IsPropertyExists(string propertyName)
{
Type type = typeof(T);
BindingFlags flags = BindingFlags.Instance | BindingFlags.Public;
foreach (PropertyInfo property in type.GetProperties(flags))
if (property.Name == propertyName)
return true;
return false;
}
}
与您的班级一起使用:
TypeValidator<a> validator = new TypeValidator<a>();
validator.IsPropertyExists("PropB")
或者您可以将它用作任何对象或泛型参数的扩展方法public static bool IsPropertyExists<T>(this T t, string propertyName)
。但对我来说,反思是邪恶的:)尝试通过设计来解决这个问题。
答案 1 :(得分:1)
我认为你所追求的是模型验证。如果是这样,也许放置验证逻辑的好地方是A类方法,如下所示:
Class A
{
Nullable<int> propA { get; set; }
int? propB { get; set; }
int? propC { get; set; }
string target {
get { return _target; }
set {
var oldtarget = _target;
_target = value;
if !IsValid()
{
_target = oldtarget;
throw new Exception("Setting target to "
+ value
+ " is not possible, ....");
}
}
}
public bool IsValid()
{
switch (_target)
{
case "banana":
return propA.HasValue() && propB.HasValue();
case "apple":
return propB.HasValue() && propC.HasValue();
}
return true;
}
}
如何检查propA是空的?取决于propA是什么......它是一个int吗?一个博尔?一个字符串?等...假设它是一个int而不是你可以使用上面的方法...
不能想到比IsValid()更“通用”的验证,也就是说,我想不出更通用的方法来验证而不知道更多......
答案 2 :(得分:0)
我猜你的意思是在你说房产存在时进行验证。
您尚未指定是否为Web或Win Form / Wpf应用程序(或whatelse)。
您可以在类上实现IDataErrorInfo并验证属性是否已正确填充。
在使用IDataErrorInfo + Validate进行Google搜索时,有大量示例可供查找,但以下是帮助我的一些例子:
How to validate child objects by implementing IDataErrorInfo on parent class