Frage

Ich habe 2 Erweiterungsmethoden, die ein MongoDB Dokument zu einer Einheit / Objekt umwandeln.

public static ProductTemplate Convert(this Document document)
{
    return null;
}

public static Product Convert(this Document document)
{
    return null;
}

Das gibt einen erwarteten mehrdeutig Aufruf Fehler, damit ich frage mich, wie ich dieses Problem beheben könnte?

Freundliche Grüße,

Pickel

War es hilfreich?

Lösung

Funktionen können nicht durch Rückgabetyp überlastet werden. Sie werden Ihre Funktionen umbenennen, um vielleicht müssen:

ConvertToProductTemplate () und ConvertToProduct ()

oder drehen Sie sie in eine Funktion, die eine gemeinsame Basisklasse oder Schnittstelle zurückgibt. (Aber dann wird der Anrufer auf eine Besetzung tun, wenn sie Ihr Ergebnis zu erhalten)

Andere Tipps

Sie können Ihre Convert Methode generisch machen:

public static T ConvertTo<T>(this Document doc) where T : SomeBaseClassOrInterface
{
    return null;
}

dann verwenden, etwa so:

var document = new Document();
var temp = document.ConvertTo<ProductTemplate>(); // returns a ProductTemplate
var prod = document.ConvertTo<Product>(); // returns a Product

Sie können die Namen ändern:

public static ProductTemplate ConvertToProductTemplate(this Document document) 
{
    return null;
}

public static Product ConvertToProduct(this Document document)
{
    return null;
}

Ich habe das Gefühl, dass Produkt und ProductTemplate Klassen beziehen sich irgendwie (z Produkt erweitert ProductTemplate ). Wenn ich Recht habe, können Sie nur die Basisklasse zurückkehren ( ProductTemplate in diesem Fall).

Tomas Lycken vorgeschlagen generische Methode zu verwenden, die ziemlich gute Idee, meiner Meinung nach, aber wenn es eine gemeinsame Schnittstelle für die Produkt- und productTemplate ist, können Sie einfach diese Schnittstelle zurückkehren und anstelle von Produkt und ProductTemplate .

Beispiel (von Tomas Lycken):

public static T ConvertTo<T>(this Document doc) where T : SomeBaseClassOrInterface
{
    return null;
}

Beispiel (von mir):

public static SomeBaseClassOrInterface ConvertTo(this Document doc)
{
    return null;
}

Und wenn es keine gemeinsame Schnittstelle ist und Sie nicht wollen, um einen neuen zu erstellen, benutzen Sie bitte nur Namen ändern:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top