调用类方法而不是扩展方法

时间:2016-10-21 13:44:09

标签: c# mongodb

我正在使用MongoDB C#Driver和NSubstitute。我需要在IMongoCollection类上模拟FindAsync方法。问题是有一个带有exact same signature的IMongoCollectionExtension类。当我尝试模拟FindAsync方法时,它调用扩展方法,该方法由于Ensure.IsNotNull调用而抛出异常。

有没有办法确保调用类方法而不是扩展方法?它现在不是这样的。它们甚至位于相同的命名空间中。

我试图通过测试调用它的示例。

        _collection = Substitute.For<IMongoCollection<DirectoryObject>>();
        _database.GetCollection<DirectoryObject>(Constants.DirectoryObjectCollection).Returns(_collection);
        _collection.FindAsync(Arg.Any<FilterDefinition<DirectoryObject>>(), null, default(CancellationToken)).Returns(cursor);

方法签名:

Task<IAsyncCursor<TProjection>> FindAsync<TProjection>(FilterDefinition<TDocument> filter, FindOptions<TDocument, TProjection> options = null, CancellationToken cancellationToken = default(CancellationToken));

扩展方法签名:

public static Task<IAsyncCursor<TDocument>> FindAsync<TDocument>(this IMongoCollection<TDocument> collection, FilterDefinition<TDocument> filter, FindOptions<TDocument, TDocument> options = null, CancellationToken cancellationToken = default(CancellationToken))

智能感知的屏幕截图,表明我正在调用扩展方法。

enter image description here

编辑:

将模拟方法调用更改为此可修复此问题。签名不完全相同。扩展名没有不同的投影和文档类型。

        _collection.FindAsync<DirectoryObject>(Arg.Any<FilterDefinition<DirectoryObject>>(), null, default(CancellationToken)).Returns(cursor);

1 个答案:

答案 0 :(得分:0)

如果没有其他人认为他们有此问题,请您参考!在实例方法和扩展方法之间的命名冲突中,就是实例方法被调用。

如果确实需要优先选择调用哪个方法,则实际上存在一个相反的问题,即直接使用其声明类来调用扩展方法。

例如名称冲突如下:

public static class ObjectExt 
{ 
    public static string ToString(this object o) => ""; 
}

您可以消除歧义:

instance.ToString(); // call the instance method

ObjectExt.ToString(instance); // call the extension method