首页 > 解决方案 > 使用反射查找枚举器的方法

问题描述

背景:

我正在使用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.

标签: c#reflectioncilenumeratorienumerator

解决方案


MoveNext不是在 上定义的,而是在由 .继承IEnumerator<T>的非泛型上定义的。IEnumeratorIEnumerator<T>

接口继承与反射结合起来有点奇怪,因此您需要直接从定义它的基接口获取方法信息:

MethodInfo targetMethod = typeof(System.Collections.IEnumerator).GetMethod("MoveNext");

推荐阅读