繁体   English   中英

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

[英]Call Class Method Rather Than Extension Method

我正在使用MongoDB C#驱动程序和NSubstitute。 我需要在IMongoCollection类上模拟FindAsync方法。 问题是存在一个具有完全相同签名的IMongoCollectionExtension类。 当我尝试模拟FindAsync方法时,它会调用扩展方法,该扩展方法会由于“ Secure.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))

IntelliSense的屏幕快照,提示我正在调用扩展方法。

在此处输入图片说明

编辑:

将模拟方法调用更改为此可以解决此问题。 签名并不完全相同。 该扩展名没有其他投影和文档类型。

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

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

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

例如,名称冲突如下:

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

您可以消除歧义为:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM