尝试获取方法信息时出现致命错误

问题描述 投票:0回答:1

我是 C# 新手,我正在尝试缩短我的代码

我能够通过错误检查让它工作。

但是有没有一种更简单/简单的方法来检查我的第二种方法代码中的错误

这似乎是获取 MethodInfo 的更好方法

                MethodInfo[] methods1 = type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)
                .Where(x =>
                    x.IsAssembly != true &&
                    x.ReturnType == typeof(void) &&
                    x.GetParameters().Length == 2 &&
                    x.GetParameters()[0].ParameterType == typeof(object) &&
                    x.GetParameters()[1].ParameterType == typeof(EventArgs))
                .ToArray();
                foreach (MethodInfo method in methods1)
                {
                    MethodBody methodBody = method.GetMethodBody();
                    if(methodBody == null) 
                        continue;

                    byte[] array = methodBody.GetILAsByteArray();
                    if (array.Length == 0) 
                        continue;

                    byte[] take = array.Take(7).ToArray();
                    if (take.Length == 0) 
                        continue;

                    byte[] skip = take.SkipWhile(b => b != 0x80).ToArray();
                    if(skip.Length == 0) 
                        continue;

                    bool last = skip.Last().Equals(0x14);
                }



                // This will crash program sometimes because there is no check on SkipWhile
                MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)
                    .Where(x =>
                        x.IsAssembly != true &&
                        x.ReturnType == typeof(void) &&
                        x.GetParameters().Length == 2 &&
                        x.GetParameters()[0].ParameterType == typeof(object) &&
                        x.GetParameters()[1].ParameterType == typeof(EventArgs))
                     .Where(m => m
                        .GetMethodBody()
                        .GetILAsByteArray()
                        .Take(7)
                        .SkipWhile(b => b != 0x80) 
                        .Last().Equals(0x14))
                     .ToArray();
c# reflection
1个回答
0
投票

如果我理解正确的话,第二种方法不会处理空方法体、空IL字节数组或跳过和获取后的空字节数组。

要处理空值,请使用

?.
而不是
.
。当 LHS 为空时,这将使整个表达式为空。另请参见 null 条件运算符

要处理空的

IEnumerable
,可以使用
LastOrDefault
代替
Last
。当
byte
为空时,这将返回 0(
IEnumerable
的默认值),而不是抛出异常。由于您正在与
0x14
进行比较,因此空的
IEnumerable
将为您提供
false
,正如您所期望的那样。

MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.NonPublic)
    .Where(x =>
        x.IsAssembly != true &&
        x.ReturnType == typeof(void) &&
        x.GetParameters().Length == 2 &&
        x.GetParameters()[0].ParameterType == typeof(object) &&
        x.GetParameters()[1].ParameterType == typeof(EventArgs) &&
        x.GetMethodBody()
            ?.GetILAsByteArray()
            ?.Take(7)
            .SkipWhile(b => b != 0x80) 
            .LastOrDefault() == 0x14
    )
    .ToArray();
© www.soinside.com 2019 - 2024. All rights reserved.