我是 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();
如果我理解正确的话,第二种方法不会处理空方法体、空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();