Domanda

Ho 2 metodi di estensione che convertono un documento MongoDB a un'entità / oggetto.

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

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

Questo dà un errore chiamata ambigua atteso così mi chiedevo come avrei potuto risolvere questo problema?

amichevoli saluti,

Pickels

È stato utile?

Soluzione

Le funzioni non possono essere sovraccaricati dal tipo di ritorno. Si dovrà rinominare le funzioni a forse:

ConvertToProductTemplate () e ConvertToProduct ()

o li trasformano in una funzione che restituisce una classe base comune o interfaccia. (Ma poi il chiamante dovrà fare un cast quando ottengono il risultato)

Altri suggerimenti

Si potrebbe rendere il vostro metodo di Convert generico:

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

Quindi utilizzare in questo modo:

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

è possibile modificare i nomi:

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

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

Ho la sensazione che prodotto e ProductTemplate le classi sono legati in qualche modo (ad esempio prodotto si estende ProductTemplate ). Se ho ragione, si può semplicemente restituire la classe di base ( ProductTemplate in questo caso).

Tomas Lycken suggerisce di utilizzare metodo generico, che è a mio parere abbastanza buona idea, ma se c'è un'interfaccia comune per il prodotto e productTemplate, si può solo tornare l'interfaccia così invece di prodotto e ProductTemplate .

Esempio (da Tomas Lycken):

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

Esempio (da me):

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

E se non c'è un'interfaccia comune e non si vuole creare uno nuovo, basta cambiare i nomi:)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top