使用name of只提供字段的名称,而不提供父字段的名称。
您可以将
nameof
像这样:
nameof(MyModelType.EmbeddedObject) + "." + nameof(MyModel.EmbeddedObject.Id)
其产量
EmbeddedObject.Id
作为
名字
将始终生成表达式链的最后一段。只需通过对每个表达式深入挖掘一个级别来构建字符串。
您也可以编写linq表达式助手:
public static string GetFullPropertyPath<TModel,TProp>(Expression<Func<TModel,TProp>> expr)
{
return String.Join(".", GetMemberList(expr.Body as MemberExpression));
}
public static List<string> GetMemberList(MemberExpression expression)
{
var result = new List<string>();
if (expression.Expression is MemberExpression memberExpression)
{
result.AddRange(GetMemberList(memberExpression));
}
result.Add(expression.Member.Name);
return result;
}
这个
GetMemberList
返回选定的成员链,不带参数。所以,如果您提供
m => m.EmbeddedObject.Id
它会回来的
[ "EmbeddedObject", "Id" ]
当与
.
S产量
嵌入对象.id
.
这个
GetFullPropertyPath
只返回表达式中与
.
性格。
Here
是一个在线演示略有修改,因为它不允许
is MemberExpression memberExpression
语法。
另外,我也建议你试试
FluentValidation library
,虽然它产生的结构验证响应稍有不同,但在我看来,它比内置的属性验证功能要多得多。