我有一个类(Application),它具有另一个自定义类(Employment)类型的多个属性。我想根据Application类的属性是否标有[Required]来有条件地验证Employment类。
从我发现的情况来看,我认为我应该使用IValidatableObject接口进行就业。问题是我不确定如何使用反射(或其他可能的东西)来检查该类的实例是否使用[Required]属性进行注释以确定是否验证它。
也许这甚至不可能。我最初为就业班设立了两个班:就业和就业需求。只有后者在其属性上具有验证属性。它有效,但我想尽可能使用一个类。
public class Application
{
[Required]
public Employment Employer1 { get; set; }
public Employment Employer2 { get; set; }
}
public class Employment : IValidatableObject
{
[Required]
public string EmployerName { get; set; }
[Required]
public string JobTitle { get; set; }
public string Phone { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
var results = new List<ValidationResult>();
var t = this.GetType();
//var pi = t.GetProperty("Id");
//var isRequired = Attribute.IsDefined(pi, typeof(RequiredAttribute));
//how can I get the attributes of this property in Application class?
if (isRequired)
{
Validator.TryValidateProperty(this.EmployerName,
new ValidationContext(this, null, null) { MemberName = "EmployerName" }, results);
Validator.TryValidateProperty(this.JobTitle,
new ValidationContext(this, null, null) { MemberName = "JobTitle" }, results);
}
return results;
}
}
答案 0 :(得分:3)
您应该能够使用Attribute.IsDefined检查所需的属性。
http://msdn.microsoft.com/en-us/library/system.attribute.isdefined.aspx
答案 1 :(得分:1)
好像你不能这样做,因为使用反射你不能获得引用你当前实例的父对象/类以及所有引用属性信息。
编辑:也许您可以使用必需和非必需的验证模式制作就业类型Generic?
答案 2 :(得分:0)
我认为您正在搜索Attribute.IsDefined方法。您必须首先获取对字段本身的引用,然后验证属性的存在。如下所示(改编自MSDN的示例):
// Get the class type (you can also get it directly from an instance)
Type clsType = typeof(Application);
// Get the FieldInfo object
FieldInfo fInfo = clsType.GetField("Employer1");
// See if the Required attribute is defined for the field
bool isRequired = Attribute.IsDefined(fInfo , typeof(RequiredAttribute));
答案 3 :(得分:0)
由于我正在尝试做的事情似乎不太可能,我根据@ user1578874的建议找到了另一种方法。我向Employment添加了一个IsRequired属性,并使用MVC Foolproof Validation将这些属性标记为[RequiredIf(“IsRequired”)]。似乎是最干净的解决方案。