2

MongoDB ドキュメントをエンティティ/オブジェクトに変換する 2 つの拡張メソッドがあります。

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

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

これにより、予想されるあいまいな呼び出しエラーが発生するため、これをどのように修正できるか疑問に思っていましたか?

友好的な挨拶、

ピクルス

4

4 に答える 4

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
于 2010-02-05T11:40:18.890 に答える
7

戻り値の型によって関数をオーバーロードすることはできません。関数の名前を次のように変更する必要があります。

ConvertToProductTemplate() および ConvertToProduct()

または、それらを共通の基本クラスまたはインターフェイスを返す 1 つの関数に変換します。(ただし、呼び出し元は結果を取得するときにキャストを行う必要があります)

于 2010-02-05T11:37:57.010 に答える
3

名前を変更できます:

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

public static Product ConvertToProduct(this Document document)
{
    return null;
}
于 2010-02-05T11:37:00.000 に答える
1

ProductクラスとProductTemplateクラスが何らかの形で関連しているように感じます (たとえば、 ProductProductTemplateを拡張します)。私が正しければ、基本クラス (この場合はProductTemplate ) を返すことができます。

Tomas Lycken はジェネリック メソッドを使用することを提案しましたが、これは私の意見では非常に良い考えですが、 Product と productTemplate に共通のインターフェイスがある場合は、ProductProductTemplateの代わりにそのインターフェイスを返すこともできます。

例 (Tomas Lycken):

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

例(私による):

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

また、共通のインターフェースがなく、新しいインターフェースを作成したくない場合は、名前を変更してください:)

于 2010-02-05T12:37:45.447 に答える