是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?
Posted
技术标签:
【中文标题】是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?【英文标题】:Is it possible to specify field names in strongly-typed way in IValidatableObject methods? 【发布时间】:2012-11-24 17:45:52 【问题描述】:在这种情况下是否可以使用某种强类型方式(lambda?)指定字段名称:
public class Demo : IValidatableObject
public string DemoField get; set;
IEnumerable<ValidationResult> IValidatableObject.Validate(ValidationContext validationContext)
if (<...>)
yield return new ValidationResult("Some validation message", new string[] "DemoField" ); // <-- Here
例如,当在字符串中指定字段名称时,它不能被重构。
【问题讨论】:
【参考方案1】:我不知道任何“内置”方式。但是你可以使用 LINQ 表达式来做这样的事情:
Expression<Func<Demo, string>> lambda = (Demo d) => d.DemoField;
string demoFieldName = ((System.Linq.Expressions.MemberExpression)lambda.Body).Member.Name;
yield return new ValidationResult("Some validation message", new string[] demoFieldName );
这样你就没有硬编码的字符串,并且重构会起作用。
【讨论】:
【参考方案2】:阅读我对这个问题的回答here:
https://***.com/a/15396656/643761
你会这样使用它:
yield return new ValidationResult("Some Error.", GetFieldNames(() => new object[] this.DemoField ));
【讨论】:
以上是关于是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?的主要内容,如果未能解决你的问题,请参考以下文章
使用 IValidatableObject 检查是不是设置了至少一个参数
如何在 IValidatableObject.Validate 方法的 ValidationContext 参数中提供 IServiceProvider
在 IValidatableObject 上设置 ValidationContext 的 Items 集合?