检查类的实例是否使用属性进行注释

时间:2013-09-27 15:03:00

标签: c# .net validation reflection data-annotations

我有一个类(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;
  }
}

4 个答案:

答案 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”)]。似乎是最干净的解决方案。