You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dotPeek反编译代码编译失败:memberExpression1/2问题修复求助

修正反编译代码的编译错误

问题分析

这段反编译代码的编译失败主要来自三个核心问题:

  1. memberExpression2未声明就直接赋值使用
  2. while循环中重复定义同名变量导致语法冲突
  3. 错误提示信息引用了错误的属性名称

修正后的完整代码

using System.Globalization;
using System.Linq.Expressions;
using System.Reflection;
using System.Collections.Generic;
using System.Linq;

namespace Test;

public class RoutingDetail
{
    protected RoutingDetail(IEnumerable<KeyValuePair<string, string>> routingParameters)
    {
        RoutingKeyParameters = routingParameters;
    }

    public IEnumerable<KeyValuePair<string, string>> RoutingKeyParameters { get; }
}

public class RoutingDetail<TMessage> : RoutingDetail
{
    public RoutingDetail()
        : base(new Dictionary<string, string>())
    {
    }

    private RoutingDetail(IEnumerable<KeyValuePair<string, string>> routingParameters)
        : base(routingParameters)
    {
    }

    public RoutingDetail<TMessage> WithRoutingHeader(
        KeyValuePair<string, string> routingHeader)
    {
        var dictionary = RoutingKeyParameters.ToDictionary(k => k.Key, k => k.Value);
        dictionary.Add(routingHeader.Key, routingHeader.Value);
        return new RoutingDetail<TMessage>(dictionary);
    }

    public RoutingDetail<TMessage> WithRoutingHeader<TRoutingValue>(
        Expression<Func<TMessage, TRoutingValue>> property,
        TRoutingValue value)
    {
        var dictionary = RoutingKeyParameters.ToDictionary(k => k.Key, k => k.Value);
        var nameValueFromFunc = GetValidPropertyNameValueFromFunc(property, value);
        dictionary.Add(nameValueFromFunc.Key, nameValueFromFunc.Value);
        return new RoutingDetail<TMessage>(dictionary);
    }

    private KeyValuePair<string, string> GetValidPropertyNameValueFromFunc<TProperty>(
        Expression<Func<TMessage, TProperty>> property,
        TProperty value)
    {
        if (property.Body is not MemberExpression memberExpression1)
        {
            if (property.Body.NodeType is ExpressionType.Convert or ExpressionType.ConvertChecked &&
                property.Body is UnaryExpression body)
            {
                memberExpression1 = body.Operand as MemberExpression;
            }

            if (memberExpression1 == null)
            {
                throw new ArgumentException($"Expression '{property}' refers to a method, not a property.");
            }
        }

        var member1 = memberExpression1.Member as PropertyInfo;
        var key = member1 != null
            ? member1.Name
            : throw new ArgumentException($"Expression '{property}' refers to a field, not a property.");
        
        if (CustomAttributeExtensions.GetCustomAttributes(member1, typeof(RouteOnAttribute), true)
                .FirstOrDefault() is not RouteOnAttribute routeOnAttribute1)
        {
            throw new ArgumentException(
                $"Property {key} does not have the RouteOn attribute, and will not be used when routing. ");
        }

        // 声明memberExpression2变量并初始化
        var memberExpression2 = memberExpression1;
        // 循环中使用不同变量名避免遮蔽,同时更新循环变量
        while (memberExpression2.Expression is MemberExpression innerMemberExpr)
        {
            memberExpression2 = innerMemberExpr;
            var member2 = memberExpression2.Member as PropertyInfo;
            if (member2 == null)
            {
                throw new ArgumentException($"Expression '{property}' refers to a field, not a property.");
            }

            key = $"{member2.Name}.{key}";
            if (CustomAttributeExtensions.GetCustomAttributes(member2, typeof(RouteOnAttribute), true)
                    .FirstOrDefault() is not RouteOnAttribute routeOnAttribute2)
            {
                // 错误提示中使用当前属性member2.Name而非member1.Name
                throw new ArgumentException(
                    $"Property {member2.Name} does not have the RouteOn attribute, and will not be used when routing. ");
            }

            if (!routeOnAttribute2.UseInnerProperties)
            {
                // 错误提示中使用当前属性member2.Name而非member1.Name
                throw new ArgumentException(
                    $"Property {member2.Name} does not have the UseInnerProperties flag set, and will not be used when routing.");
            }
        }

        return new KeyValuePair<string, string>(key,
            string.Format(CultureInfo.InvariantCulture, routeOnAttribute1.FormatString, value));
    }
}

[AttributeUsage(AttributeTargets.Property)]
public class RouteOnAttribute : Attribute
{
    public RouteOnAttribute()
    {
        FormatString = "{0}";
        UseInnerProperties = false;
    }

    public string FormatString { get; set; }

    public bool UseInnerProperties { get; set; }
}

关键修正说明

  1. 声明memberExpression2变量:
    原代码直接赋值未声明的变量,添加var memberExpression2 = memberExpression1;完成变量声明与初始化。

  2. 修复while循环的变量遮蔽问题:
    原循环重复使用memberExpression2作为模式匹配变量导致语法冲突,改为用innerMemberExpr作为模式变量,同时更新memberExpression2以遍历嵌套属性链。

  3. 修正错误提示的属性名称:
    原代码错误引用最内层属性名称,改为使用当前外层属性的member2.Name,保证错误信息准确。

内容的提问来源于stack exchange,提问作者nop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:35:25