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

本文关键字:对象 引用 获取 表达式 | 更新日期: 2023-09-27 18:19:54

我有一个扩展通用方法

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

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

如果不将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")

我想您真的希望使用文本"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,这只是为了举例说明。