C#不明确的调用 - 不同的返回类型

时间:2010-02-05 11:34:44

标签: c# .net extension-methods mongodb ambiguous

我有2个将MongoDB文档转换为实体/对象的扩展方法。

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

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

这给出了一个预期的模糊调用错误,所以我想知道如何解决这个问题?

友好的问候,

Pickels

4 个答案:

答案 0 :(得分:9)

您可以将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

答案 1 :(得分:7)

返回类型不能重载函数。您必须将您的功能重命名为:

ConvertToProductTemplate() 和 ConvertToProduct()

或将它们转换为一个返回公共基类或接口的函数。 (但是当调用者得到结果时,他们必须进行演员表)

答案 2 :(得分:3)

您可以更改名称:

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

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

答案 3 :(得分:1)

我感觉产品 ProductTemplate 类以某种方式相关(例如产品扩展 ProductTemplate )。如果我是对的,你可以返回基类(在这种情况下是 ProductTemplate )。

Tomas Lycken建议使用泛型方法,这在我看来是个好主意,但如果有一个通用的Product和productTemplate接口,你也可以返回该接口,而不是产品和的 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;
}

如果没有通用界面且您不想创建新界面,请更改名称:)