首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法通过dotPeek编译反编译代码

无法通过dotPeek编译反编译代码
EN

Stack Overflow用户
提问于 2022-10-27 15:27:07
回答 1查看 29关注 0票数 0

我正在查看下面的反编译代码,由于memberExpression1memberExpression2,它不会编译。我怎么把拼图放回去,这样它就可以编译了?

代码语言:javascript
复制
using System.Globalization;
using System.Linq.Expressions;
using System.Reflection;

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 = (object)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 = memberExpression1;
        while (memberExpression2.Expression is MemberExpression memberExpression2)
        {
            var member2 = memberExpression2.Member as PropertyInfo;
            if ((object)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)
            {
                throw new ArgumentException(
                    $"Property {member1.Name} does not have the RouteOn attribute, and will not be used when routing. ");
            }

            if (!routeOnAttribute2.UseInnerProperties)
            {
                throw new ArgumentException(
                    $"Property {member1.Name} does not have the UseInnerProperties attribute 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; }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-27 15:58:16

if (property.Body is not MemberExpression memberExpression1){ ... }转换为

代码语言:javascript
复制
var memberExpression1 = property.Body as MemberExpression;
if (memberExpression1 is null) {
    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.");
    }
}

转换

代码语言:javascript
复制
memberExpression2 = memberExpression1;
while (memberExpression2.Expression is MemberExpression memberExpression2)  { ... }

代码语言:javascript
复制
MemberExpression memberExpression2 = memberExpression1;
while (memberExpression2.Expression is MemberExpression) { ... }

复制/粘贴您不理解的代码是不可取的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74224561

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档