2014-03-06 4 views
16

I BitFactory Protokollierung bin mit, die eine Reihe von Methoden, wie diese macht:Erzwingen meinen Code meine Erweiterungsmethode verwenden

public void LogWarning(object aCategory, object anObject) 

ich eine Erweiterungsmethode haben, dass dies ein bisschen schöner für unsere Protokollierung macht benötigt:

public static void LogWarning(this CompositeLogger logger, 
     string message = "", params object[] parameters) 

die nur einige gemeinsame Holzeinschlag hüllt, und bedeutet, dass ich wie anmelden können:

Logging.LogWarning("Something bad happened to the {0}. Id was {1}",foo,bar);

Aber wenn ich nur eine Zeichenfolge in meinem params object[] habe, dann wird meine Erweiterungsmethode nicht aufgerufen, stattdessen wird die ursprüngliche Methode gewählt.

Abgesehen davon, dass ich meine Methode etwas anderes nenne, gibt es eine Möglichkeit, das zu verhindern?

+2

Klassenmethoden haben immer Vorrang Über Erweiterungsmethoden, also würde ich nein sagen. Aber vielleicht kennt jemand eine Workaround. – Gorpik

+0

Erweiterungsmethoden (mit ähnlich benannten Nicht-Erweiterungsmethode (n)), optionale Argumente, * und * 'params' alle in einer Methode? Sie mögen es, den Compiler zu verwirren, oder? –

Antwort

14

Die Regeln darüber, wie überladene Methoden eines aufgelöst werden (oder einen Fehler) sind komplex (die C# Spezifikation ist in Visual Studio für alle blutigen Details enthalten).

Aber es gibt eine einfache Regel: Erweiterungsmethoden werden nur berücksichtigt, wenn es kein mögliches Mitglied gibt, das aufgerufen werden kann.

Da die Signatur zweier Objekte zwei beliebige Parameter akzeptiert, entspricht jeder Aufruf mit zwei Parametern diesem Element. Daher werden keine Erweiterungsmethoden als Möglichkeiten in Betracht gezogen.

Sie könnten einen dritten Parameter übergeben (zB String.Empty) und nicht im Format verwenden.

Oder, und ich vermute, das ist besser, mögliche Wechselwirkungen mit Ergänzungen der Bibliothek (Argumentliste variabler Länge Methoden neigen dazu) zu vermeiden, umbenennen, um LogWarningFormat (verwandt mit der Benennung von StringBuffer.AppendFormat).

PS. Es gibt keinen Grund, einen Standardwert für den Parameter message zu haben: Er wird niemals verwendet, wenn Sie keine Argumente übergeben: aber das würde nichts protokollieren.

+0

Danke für die PS über den Standard für die Nachricht. –

8

Deklarierte Methoden sind immer vor der Erweiterung Methoden. Wenn Sie die Erweiterung unabhängig von der deklarierten Methode aufrufen möchten, müssen Sie sie als reguläre statische Methode der Klasse aufrufen, die sie deklariert hat.

zB:

LoggerExtensions.LogWarning(Logging, "Something bad happened to the {0}. Id was {1}",foo,bar); 

Ich gehe davon aus, dass die Erweiterung in einer Klasse deklariert wird genannt LoggerExtensions

2

Vorausgesetzt, dass ich denke, ein Verfahren mit einem anderen Namen ist der Weg zu gehen (leichter zu lesen und zu pflegen), als Behelfslösung Sie Parameter als benannte Parameter angeben können:

logger.LogWarning("Something bad happened to the {0}.", parameters: "foo"); 
Verwandte Themen