【问题标题】:Get reference to object from c# expression从 C# 表达式中获取对对象的引用
【发布时间】:2012-07-31 05:07:27
【问题描述】:

我有一个扩展泛型方法

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

【问题讨论】:

  • 表达式中没有这样的对象——x 是表达式的参数,您应该将类​​型的对象传递给它。 (或者我理解你想要实现的目标是错误的。)
  • 感谢您的回复,Inerdial )
  • 您真的希望对象或文本Login 用于AddModelError(key, errorMessage) 方法吗?使用ExpressionHelper.GetExpressionText(MVC 内置)从 lambda 表达式中获取属性名称。
  • @subkamran 你的意思可能是lambda expression...
  • 我需要 TModel 对象的引用)我不想传递另一个参数来引用对象)

标签: c# asp.net-mvc expression


【解决方案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")

【讨论】:

  • 感谢您的回复,我也没有看到其他方法。我昨天已经在我的代码中完成了这个 ^)
【解决方案2】:

我想您真的希望文本“登录”用于将新模型错误添加到 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,这只是为了说明。

【讨论】:

  • 感谢回复,但我需要将资源键和默认值等错误数据保存到modelState对象和TModel对象中。使用表达式我传递与错误数据相关的属性,该属性应保存到 TModel 对象中。 )
  • 为此,您需要将实际对象作为参数传入。泛型不是对象引用本身。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2011-07-02
  • 2017-11-04
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多