C # chiamate ambigui - vari tipi di ritorno
-
18-09-2019 - |
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
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:)