在c#中包装一个Extension方法

本文关键字:一个 Extension 方法 包装 | 更新日期: 2024-07-27 14:01:32

我正在尝试包装NHibernate Fetch扩展方法,这样我就可以在没有完整的NHibernat会话的情况下使用它来测试查询。

我遵循了这种方法,它似乎还可以,但使用它意味着我需要给新的Fetch方法取一个不同的名称。(示例中使用了EaglelyFetch)

如果我把它重命名为Fetch,我会得到一个无限循环,因为包装器调用它自己的Fetch扩展方法,而不是NHibernate.Linq方法。

有人知道这方面的办法吗。我想我可以添加另一个抽象层次,但只是希望有更优雅的东西。

在c#中包装一个Extension方法

您不能。

MSDN Says

*您可以使用扩展方法来扩展类或接口,但不能覆盖它们永远不会调用与接口或类方法具有相同名称和签名的扩展方法。在编译时,扩展方法的优先级总是低于类型本身定义的实例方法。*

您必须通过其holder类来限定NHibernate扩展,以便将其与您自己的扩展区分开来。它产生了一个简单的静态方法调用,而不是扩展调用,但这对您的情况来说应该不是问题。

using NHibernate.Linq;    
namespace YourOwnExtensionsNameSpace
{
    public static class YourOwnExtensionClass
    {
        public static INhFetchRequest<TOriginating, TRelated> 
            Fetch<TOriginating, TRelated>(
                this IQueryable<TOriginating> query,
                Expression<Func<TOriginating, TRelated>> relatedObjectSelector)
        {
            EagerFetchingExtensionMethods.Fetch(query, relatedObjectSelector);
        }
        ...
    }
}

但是,为了避免名称冲突,您必须在希望调用自己的Fetch的文件中禁止任何using NHibernate.Linq;

请参阅此处查看所有渴望获取的扩展。我举了第一个例子。