Неоднозначные вызовы C # - Другой возвращаемый тип
-
18-09-2019 - |
Вопрос
У меня есть 2 метода расширения, которые преобразуют документ MongoDB в сущность / объект.
public static ProductTemplate Convert(this Document document)
{
return null;
}
public static Product Convert(this Document document)
{
return null;
}
Это приводит к ожидаемой неоднозначной ошибке вызова, поэтому мне было интересно, как я мог бы это исправить?
Дружеские приветствия,
Пикели
Решение
Функции не могут быть перегружены по типу возвращаемого значения.Вам придется переименовать свои функции в maybe:
ConvertToProductTemplate() и ConvertToProduct()
или превратите их в одну функцию, которая возвращает общий базовый класс или интерфейс.(Но тогда вызывающий должен будет выполнить приведение, когда получит ваш результат)
Другие советы
Вы могли бы сделать свой Convert
общий метод:
public static T ConvertTo<T>(this Document doc) where T : SomeBaseClassOrInterface
{
return null;
}
Затем используйте его следующим образом:
var document = new Document();
var temp = document.ConvertTo<ProductTemplate>(); // returns a ProductTemplate
var prod = document.ConvertTo<Product>(); // returns a Product
вы могли бы изменить имена:
public static ProductTemplate ConvertToProductTemplate(this Document document)
{
return null;
}
public static Product ConvertToProduct(this Document document)
{
return null;
}
У меня есть ощущение, что Продукт и Шаблон продукта классы каким - то образом связаны (например Продукт расширяет Шаблон продукта).Если я прав, вы можете просто вернуть базовый класс (Шаблон продукта в данном случае).
Томас Ликкен предложил использовать универсальный метод, что, на мой взгляд, является неплохой идеей, но если есть общий интерфейс для Product и productTemplate, вы можете просто вернуть этот интерфейс вместо Продукт и Шаблон продукта.
Пример (автор: Томас Ликен):
public static T ConvertTo<T>(this Document doc) where T : SomeBaseClassOrInterface
{
return null;
}
Пример (мной):
public static SomeBaseClassOrInterface ConvertTo(this Document doc)
{
return null;
}
И если общего интерфейса нет, и вы не хотите создавать новый, пожалуйста, просто измените имена :)