Question

J'ai 2 méthodes d'extension qui convertissent un document MongoDB à une entité / objet.

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

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

Cela donne une erreur d'appel ambigu attendu je me demandais si je pouvais comment résoudre ce problème?

Amicalement,

Pickels

Était-ce utile?

La solution

Les fonctions ne peuvent être surchargées par type de retour. Vous devrez renommer vos fonctions peut-être:

ConvertToProductTemplate () et ConvertToProduct ()

ou les transformer en une fonction qui retourne une classe de base commune ou de l'interface. (Mais l'appelant devra faire un casting quand ils le résultat)

Autres conseils

Vous pouvez faire votre méthode de Convert générique:

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

Utilisez ensuite comme ceci:

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

vous pouvez changer les noms:

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

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

J'ai le sentiment que Produit et ProductTemplate classes sont en quelque sorte liés (par exemple Produit étend ProductTemplate ). Si je ne me trompe pas, vous pouvez simplement retourner la classe de base ( ProductTemplate dans ce cas).

Tomas Lycken a suggéré d'utiliser la méthode générique, qui est à mon avis tout à fait une bonne idée, mais s'il y a une interface commune pour les produits et productTemplate, vous pouvez simplement retourner cette interface aussi bien au lieu de Produit ProductTemplate .

Exemple (par Tomas Lycken):

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

Exemple (par moi):

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

Et s'il n'y a pas d'interface commune et vous ne voulez pas créer un nouveau, s'il vous plaît changer simplement les noms:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top