C # Двусмысленные вызовы - Другой тип возврата - PullRequest
2 голосов
/ 05 февраля 2010

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

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

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

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

Привет,

Pickels

Ответы [ 4 ]

9 голосов
/ 05 февраля 2010

Вы можете сделать свой метод 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
7 голосов
/ 05 февраля 2010

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

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

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

3 голосов
/ 05 февраля 2010

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

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

public static Product ConvertToProduct(this Document document)
{
    return null;
}
1 голос
/ 05 февраля 2010

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

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

Пример (автор Tomas Lycken):

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

Пример (от меня):

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

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

...