如何检索属性的关联对象的实例?

时间:2010-04-07 19:38:13

标签: c# validation reflection attributes

我正在编写一个PropertiesMustMatch验证属性,可以将字符串属性名称作为参数。我希望它在该对象上按名称查找相应的属性并进行基本的相等比较。 通过反思访问此内容的最佳方式是什么?

此外,我检查了企业库中的验证应用程序块,并确定其PropertyComparisonValidator太强烈,无法满足我们的需求。

更新为了进一步说明(提供一些上下文),目标只是强制执行字段匹配(例如,密码验证)。如果可能的话,我们希望它能够使用从ValidationAttribute类继承的属性级属性数据注释。

更新:如果有人好奇,我最后通过调整代码提供的解决方案来解决实际的业务问题question

3 个答案:

答案 0 :(得分:4)

基本上,你不能。检查对象是否存在属性的代码还必须负责告诉任何代码它正在查看哪个类型/对象。您无法从 属性中获取任何其他元数据。

答案 1 :(得分:1)

你做不到。另见this question。尝试更改逻辑以使用对象,检查其属性,反之亦然。您还可以提供有关任务的更多信息,而不仅仅是这个狭隘的问题。

答案 2 :(得分:0)

你可以这样。

//target class
public class SomeClass{

  [CustomRequired(ErrorMessage = "{0} is required", ProperytName = "DisplayName")]
  public string Link { get; set; }

  public string DisplayName { get; set; }
}
//custom attribute
public class CustomRequiredAttribute : RequiredAttribute, IClientValidatable
{
  public string ProperytName { get; set; }

  public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
  {
    var propertyValue = "Value";
    var parentMetaData = ModelMetadataProviders.Current
         .GetMetadataForProperties(context.Controller.ViewData.Model, context.Controller.ViewData.Model.GetType());
    var property = parentMetaData.FirstOrDefault(p => p.PropertyName == ProperytName);
    if (property != null)
        propertyValue = property.Model.ToString();

    yield return new ModelClientValidationRule
    {
        ErrorMessage = string.Format(ErrorMessage, propertyValue),
        ValidationType = "required"
    };
  }
}