2016-04-11 18 views
0

Ich versuche, die NHibernate Fetch-Erweiterungsmethode umschließen, damit ich Abfragen ohne eine vollständige NHibernate-Sitzung testen können.Wickeln Sie eine Erweiterungsmethode in C#

Ich habe this Ansatz verfolgt und es scheint zu funktionieren, OK, aber damit bedeutet, ich muss einen anderen Namen für die neue Fetch-Methode geben. (EagerlyFetch wird im Beispiel verwendet)

Wenn ich es in Fetch umbenenne, bekomme ich eine Endlosschleife, da der Wrapper seine eigene Fetch-Erweiterungsmethode statt der NHibernate.Linq-Methode aufruft.

Kennt jemand einen Weg um dies. Ich denke, ich kann eine weitere Ebene der Abstraktion hinzufügen, aber ich hoffe nur, dass es etwas anmutiger ist.

Antwort

2

Sie können nicht.

MSDN Says

* Sie Erweiterungsmethoden verwenden, um eine Klasse oder Schnittstelle zu verlängern, aber nicht, sie zu überschreiben. Eine Erweiterungsmethode mit demselben Namen und derselben Signatur wie eine Schnittstelle oder eine Klassenmethode wird niemals aufgerufen. Zur Kompilierungszeit haben Erweiterungsmethoden immer eine niedrigere Priorität als die im Typ selbst definierten Instanzmethoden.

+0

Er möchte eine Vanilla-Klassenmethode nicht überschreiben. Er möchte nur eine eigene Erweiterungsmethode anstelle der "nativen" Erweiterungsmethode verwenden. Was er machen will, ist machbar. –

0

Sie müssen die NHibernate-Erweiterung durch ihre Inhaberklasse für die Entdifferenzierung von Ihrer eigenen qualifizieren. Es führt zu einem einfachen statischen Methodenaufruf anstelle eines Erweiterungsaufrufformulars, aber das sollte kein Problem für Ihren Fall sein.

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); 
     } 
     ... 
    } 
} 

Aber dann, Namenskonflikte zu vermeiden, würden Sie jede using NHibernate.Linq; in Dateien, in denen verbieten müssen Sie Ihren eigenen Fetch nennen.

Siehe here für alle eifrigen Abruf-Erweiterungen. Ich habe die erste für dieses Beispiel genommen.

+0

Going to mich selbst wenn es so einfach wäre. Danke wird es versuchen. –

Verwandte Themen