C # llamadas ambiguas - Diferente tipo de retorno
-
18-09-2019 - |
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
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:)