C# 用c语言包装一个扩展方法#

C# 用c语言包装一个扩展方法#,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我正在尝试包装NHibernate获取扩展方法,以便在不使用完整的NHibernate会话的情况下使用它测试查询 我遵循了这种方法,它似乎工作正常,但使用它意味着我需要为新的Fetch方法指定一个不同的名称。(示例中使用了急切获取) 如果我将它重命名为Fetch,我会得到一个无限循环,因为包装器调用它自己的Fetch扩展方法,而不是NHibernate.Linq方法 有人知道这件事吗。我想我可以添加另一个抽象层次,但只是希望有更优雅的东西。你不能 *可以使用扩展方法扩展类或接口,但不能重写它们

我正在尝试包装NHibernate获取扩展方法,以便在不使用完整的NHibernate会话的情况下使用它测试查询

我遵循了这种方法,它似乎工作正常,但使用它意味着我需要为新的Fetch方法指定一个不同的名称。(示例中使用了急切获取)

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

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

你不能


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

您必须通过其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);
        }
        ...
    }
}
使用NHibernate.Linq;
命名空间YourOwnExtensionNamespace
{
公共静态类YourOwnExtensionClass
{
公共静态请求
取回(
这是一个易懂的问题,
表达式相关对象选择器)
{
Fetch(查询,relatedObjectSelector);
}
...
}
}
但是,为了避免名称冲突,您必须禁止使用NHibernate.Linq在您希望调用自己的
获取
的文件中


有关所有急切获取扩展,请参阅。我在这个例子中使用了第一个方法。

他不想覆盖普通类方法。他只想使用自己的扩展方法,而不是“本机”扩展方法。他想做的是可行的。如果这么简单的话,我会踢自己。谢谢,我会试试的。