c# - 使用反射查找枚举器的方法
问题描述
背景:
我正在使用Harmony Library修改现有代码。现有的 C# 代码遵循以下结构:
public class ToModify
{
public override void Update()
{
foreach (StatusItemGroup.Entry entry in collection)
{
// I am trying to alter an operation at the end of this loop.
}
}
}
public class StatusItemGroup
{
public IEnumerator<Entry> GetEnumerator()
{
return items.GetEnumerator();
}
private List<Entry> items = new List<Entry>();
public struct Entry { }
}
由于这种情况,我必须修改正在生成的 IL 代码,为此我必须获取MethodInfo
我的目标操作数。这是目标:
IL_12B6: callvirt instance bool [mscorlib]System.Collections.IEnumerator::MoveNext()
问题:
如何获得枚举MethodInfo
器的方法?MoveNext
我试过的:
我能想到的一切都产生了null
结果。这是我最基本的尝试:
MethodInfo targetMethod = typeof(IEnumerator<StatusItemGroup.Entry>).GetMethod("MoveNext");
我不明白为什么这不起作用,我不知道我需要做什么才能正确获得MethodInfo
.
解决方案
MoveNext
不是在 上定义的,而是在由 .继承IEnumerator<T>
的非泛型上定义的。IEnumerator
IEnumerator<T>
接口继承与反射结合起来有点奇怪,因此您需要直接从定义它的基接口获取方法信息:
MethodInfo targetMethod = typeof(System.Collections.IEnumerator).GetMethod("MoveNext");
推荐阅读
- reactjs - 和设计表 TypeScript getColumnSearchProps 示例
- c# - Microsoft Bot Framework .Net 中的 Directline API 和 OAuth2 有什么区别?
- laravel - Amcharts 自定义可变颜色
- amazon-web-services - 如何预测 Fargate 容器的 IP 范围
- r - 如何在r中的线性回归中制作“期望值线”
- javascript - 无法从输入字段 daterangepicker 传递值 - Zeppelin Angular
- javascript - Nodejs 订阅按钮将我重定向到 127.0.0.1
- python - Pyinstaller 不适用于图像显示 python 应用程序?我究竟做错了什么?
- rxjs - 为什么在范围运算符中使用 asyncScheduler 关键字会推迟订阅?
- javascript - 如何使 Promise 解析在 else 语句 javascript 中触发?