我有一个扩展通用方法
public static void AddError<TModel>(
this ModelStateDictionary modelState,
Expression<Func<TModel, object>> expression,
string resourceKey,
string defaultValue)
{
// How can I get a reference to TModel object from expression here?
}
我需要从表达式获取对TModel对象的引用。 此方法由以下代码调用:
ModelState.AddError<AccountLogOnModel>(
x => x.Login, "resourceKey", "defaultValue")
答案 0 :(得分:1)
如果不将TModel对象传递给方法,则无法访问它。您传入的表达式仅表示“从TModel获取此属性”。它实际上并没有提供TModel来操作。所以,我会将代码重构为这样的东西:
public static void AddError<TModel>(
this ModelStateDictionary modelState,
TModel item,
Expression<Func<TModel, object>> expression,
string resourceKey,
string defaultValue)
{
// TModel's instance is accessible through `item`.
}
然后你的调用代码看起来像这样:
ModelState.AddError<AccountLogOnModel>(
currentAccountLogOnModel, x => x.Login, "resourceKey", "defaultValue")
答案 1 :(得分:0)
我想你真的希望文本“Login”用于向ModelStateDictionary
添加新的模型错误。
public static void AddError<TModel>(this ModelStateDictionary modelState,
Expression<Func<TModel, object>> expression, string resourceKey, string defaultValue)
{
var propName = ExpressionHelper.GetExpressionText(expression);
modelState.AddModelError(propName, GetResource("resourceKey") ?? defaultValue);
}
假设您有一些资源工厂/方法,如果找不到资源,则返回null
,这只是为了说明。