Pregunta

Tengo 2 métodos de extensión que convierten un documento MongoDB a una entidad / objeto.

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

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

Esto da un error de llamada ambigua espera así que me preguntaba cómo podría solucionar este problema?

Saludos cordiales,

Pickels

¿Fue útil?

Solución

Las funciones no pueden ser sobrecargados por tipo de retorno. Usted tendrá que cambiar el nombre de sus funciones a lo mejor:

ConvertToProductTemplate () y ConvertToProduct ()

o convertirlos en una función que devuelve una clase base común o interfaz. (Pero entonces la persona que llama tendrá que hacer un molde cuando consiguen su resultado)

Otros consejos

Se podría hacer que su método Convert genérica:

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

A continuación, utilizarla de este modo:

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

podría cambiar los nombres:

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

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

Tengo la sensación de que Producto y ProductTemplate clases están relacionados de alguna manera (por ejemplo, Producto se extiende ProductTemplate ). Si estoy en lo cierto, sólo puede devolver la clase base ( ProductTemplate en este caso).

Tomas Lycken sugiere utilizar método genérico, que es en mi opinión muy buena idea, pero si hay una interfaz común para productos y productTemplate, sólo puede volver esa interfaz, así en lugar de Producto y ProductTemplate .

Ejemplo (por Tomas Lycken):

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

Ejemplo (por mí):

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

Y si no hay ninguna interfaz común y que no quieren crear uno nuevo, por favor, sólo cambiar los nombres de:)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top