静态调用扩展方法会抛出MissingMethodException

时间:2014-12-15 10:14:30

标签: c# .net extension-methods missingmethodexception

我有一个扩展方法,可以将一组项目拆分为更小的子集:

static class MyClass {
    /// <summary>
    /// Breaks a list of items into chunks of a specific size
    /// </summary>
    public static IEnumerable<IEnumerable<T>> chunk<T>(this IEnumerable<T> source, int chunksize)
    {
        while (source.Any())
        {
            yield return source.Take(chunksize);
            source = source.Skip(chunksize);
        }
    }
}

现在我可以通过

调用此方法
  • MyClass.chunk(myEnumerable, 500),或使用
  • myEnumerable.chunk(200)

右?但是当我使用静态(第一个)呼叫时,我的一个客户抱怨MissingMethodException

  

System.MissingMethodException:未找到方法:System.Collections.Generic.List´1<System.Collections.Generic.List´1<!!0>> MyClass.chunk(System.Collections.Generic.IEnumerable´1<!!0>, Int32)。)。

我无法重现它,也许在你的帮助下我可能......

1 个答案:

答案 0 :(得分:4)

您是否注意到您的方法返回IEnumerable<IEnumerable<T>,但错误消息是在讨论返回List<List<T>>的方法?

如果我不得不猜测,我说你已经在某个时候更改了扩展方法的返回类型。然后,您只替换了包含扩展方法的DLL,现在其他一些依赖DLL试图像以前一样调用您的扩展方法......但它当然不再存在。

你必须重新编译&amp;重新部署引用/调用扩展方法的所有程序集。

P.S。:无论您是通过MyClass.chunk(myEnumerable, 500)还是myEnumerable.chunk(200)调用您的扩展方法,都没有任何区别;后一种调用扩展方法的方式是前者的语法快捷方式,C#编译器会自动将扩展方法调用转换为它真正的静态方法调用。