3

在这种情况下是否可以使用某种强类型方式(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
        }
    }

}

例如,当在字符串中指定字段名称时,它不能被重构。

4

2 回答 2

4

我不知道任何“内置”方式。但是你可以使用 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 });

这样您就没有硬编码的字符串,并且重构将起作用。

于 2012-12-06T20:50:16.577 回答
1

在这里阅读我对这个问题的回答:

https://stackoverflow.com/a/15396656/643761

你会像这样使用它:

yield return new ValidationResult("Some Error.", GetFieldNames(() => new object[] { this.DemoField }));
于 2014-06-02T02:41:36.713 回答