dotPeek反编译代码编译失败:memberExpression1/2问题修复求助
修正反编译代码的编译错误
问题分析
这段反编译代码的编译失败主要来自三个核心问题:
memberExpression2未声明就直接赋值使用- while循环中重复定义同名变量导致语法冲突
- 错误提示信息引用了错误的属性名称
修正后的完整代码
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; } }
关键修正说明
声明
memberExpression2变量:
原代码直接赋值未声明的变量,添加var memberExpression2 = memberExpression1;完成变量声明与初始化。修复while循环的变量遮蔽问题:
原循环重复使用memberExpression2作为模式匹配变量导致语法冲突,改为用innerMemberExpr作为模式变量,同时更新memberExpression2以遍历嵌套属性链。修正错误提示的属性名称:
原代码错误引用最内层属性名称,改为使用当前外层属性的member2.Name,保证错误信息准确。
内容的提问来源于stack exchange,提问作者nop
相关产品推荐
相关产品推荐

