从c#表达式获取对象的引用

时间:2012-01-09 19:12:13

标签: c# asp.net-mvc expression

我有一个扩展通用方法

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")

2 个答案:

答案 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,这只是为了说明。