首页 > 后端开发 > C++ > 如何转换 MVC 参数中嵌套属性的表达式?

如何转换 MVC 参数中嵌套属性的表达式?

Barbara Streisand
发布: 2025-01-18 06:57:08
原创
491 人浏览过

How to Transform Expressions for Nested Properties in MVC Parameters?

在MVC参数中生成嵌套属性表达式

目标是创建一个方法,将类似于“cust => cust.Name”的表达式转换为“parent => parent.obj.Name”,其中“parent”代表具有类型为“T”的字段的MVC模型。此转换后的表达式应作为MVC方法的参数兼容。

组合表达式

提出的解决方案的核心是组合表达式,类似于函数的组合方式。以下代码演示了组合机制:

<code class="language-csharp">public static Expression<Func<TSource, TResult>> Compose<TSource, TIntermediate, TResult>(
    this Expression<Func<TSource, TIntermediate>> first,
    Expression<Func<TIntermediate, TResult>> second)
{
    return Expression.Lambda<Func<TSource, TResult>>(
        second.Body.Replace(second.Parameters[0], first.Body),
        first.Parameters[0]);
}</code>
登录后复制

此方法利用以下代码替换表达式实例:

<code class="language-csharp">public class ReplaceVisitor : ExpressionVisitor
{
    private readonly Expression from, to;
    public ReplaceVisitor(Expression from, Expression to)
    {
        this.from = from;
        this.to = to;
    }

    public override Expression Visit(Expression ex)
    {
        if (ex == from) return to;
        else return base.Visit(ex);
    }
}

public static Expression Replace(this Expression ex,
    Expression from,
    Expression to)
{
    return new ReplaceVisitor(from, to).Visit(ex);
}</code>
登录后复制

实际示例

给定一个属性选择器:

<code class="language-csharp">Expression<Func<object, string>> propertySelector = cust => cust.Name;</code>
登录后复制

和一个模型选择器:

<code class="language-csharp">Expression<Func<Model, Customer>> modelSelector = model => model.Customer;</code>
登录后复制

您可以按如下方式组合它们:

<code class="language-csharp">Expression<Func<Model, string>> magic = modelSelector.Compose(propertySelector);</code>
登录后复制

使用此技术,您可以转换表达式以访问嵌套属性,使其适合MVC方法参数。

以上是如何转换 MVC 参数中嵌套属性的表达式?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板