Вопрос

У меня есть 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top