C # Двусмысленные вызовы - Другой тип возврата

2

У меня есть 2 метода расширения, которые конвертируют документ MongoDB в объект/объект.

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

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

Это дает ожидаемую двусмысленную ошибку вызова, поэтому мне было интересно, как я могу это исправить?

Дружественные приветствия,

Pickels

Теги:
ambiguous
extension-methods

4 ответа

7
Лучший ответ

Функции не могут быть перегружены с помощью типа возврата. Вам нужно будет переименовать свои функции, возможно,:

ConvertToProductTemplate() а также ConvertToProduct()

или превратить их в одну функцию, которая возвращает общий базовый класс или интерфейс. (Но тогда вызывающему нужно будет сделать бросок, когда они получат ваш результат)

  • 0
    Спасибо, это ответ, который я искал.
  • 0
    или если вы действительно хотите сохранить имя. Вы можете поместить методы расширения в разные пространства имен, но я предлагаю придерживаться решения с разными именами, так как полагаясь на порядок ваших операторов using, вы получите очень сложный для чтения код
Показать ещё 2 комментария
8

Вы можете сделать свой метод 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
  • 0
    +1. Хотя мне нравится этот подход, он уместен только тогда, когда у вас есть интерфейс / базовый класс. И если у вас много производных и вы хотите преобразовать только некоторые из них, вы сможете вызвать метод, но должны проверить результат на ноль или получить исключение. Я предпочитаю явный стиль ConvertToType (). Я предпочел бы увидеть 3 метода, которые я знаю, что могу использовать, чем один, который работает для 3 типов, но не для 3 других.
  • 0
    Зачем писать универсальный метод для общего интерфейса, если вы можете вернуть этот интерфейс из неуниверсального метода? Пожалуйста, смотрите мой ответ для более подробной информации.
Показать ещё 2 комментария
3

вы можете изменить имена:

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

public static Product ConvertToProduct(this Document document)
{
    return null;
}
  • 0
    Да, на самом деле я просто думал, что может быть лучше просто назвать их ToProductTemplate и ToProduct.
  • 0
    Это способ .NET именовать эти вещи. Посмотрите на статический класс Convert .
1

У меня такое чувство, что классы Продукт и ProductTemplate связаны как-то (например, Продукт расширяет ProductTemplate). Если я прав, вы можете просто вернуть базовый класс ( ProductTemplate в этом случае).

Tomas Lycken предложил использовать общий метод, который, на мой взгляд, неплохая идея, но если есть общий интерфейс для Product и productTemplate, вы можете просто вернуть этот интерфейс, а не Продукт и ProductTemplate.

Пример (по Томасу Ликену):

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

Пример (по мне):

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

И если нет общего интерфейса и вы не хотите создавать новый, просто измените имена:)

  • 0
    Вы правы, продукт и шаблон связаны между собой. Я хочу, чтобы пользователь мог создавать свои собственные продукты, и эта информация хранится в виде шаблонов продуктов. Это набор свойств, которые может иметь каждый продукт. Все еще выполняется несколько тестов, чтобы увидеть, каков наилучший подход. Я благодарю вас за ваш ответ, я обязательно посмотрю на него.
  • 0
    не проблема ли в этом, что если Product расширяет Template, вы не узнаете, есть ли у вас Product, не пытаясь его разыграть? Если вы всегда можете создать Продукт, тогда вам нужен только один метод конвертации, а если Продукт действительно расширяет Шаблон, тогда вы можете использовать продукт везде, где вам может понадобиться шаблон. Я не вижу выгоды от возвращения базового класса. просветите меня.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню