2

2 番目の呼び出しスタイルは、最初の呼び出しスタイルに似ている必要があります。私のコードの詳細を参照してください。どんな助けでも本当に感謝しています。

これが私が使用しているコードです。

// 最初のメソッドの呼び出しスタイル

            var source = db.ThinkFeeds.Single(tf => tf.ID == 1);
            var target = new MyProduct.UIEntities.ThinkFeed();
            TypeConverter.ConvertBlToUi(source, target);

//2 番目のメソッドの呼び出しスタイル。本当に奇妙な電話スタイルです。

        var source = MyProduct.UIEntities.Book.GetBookByID(1);
        var target = new MyProduct.DTOEntities.Book();
        TypeConverter.ConvertUiToDto<MyProduct.UIEntities.Book, MyProduct.DTOEntities.Book, Book>(source, target);

//最初の方法

    public static void ConvertBlToUi<TBl, TUi>(TBl entitySource, TUi entityTarget)
    {

    }

// 2 番目の方法

    public static void ConvertUiToDto<TUi, TDto, TEntity>(TUi uiEntity, TDto dtoEntity)
        where TDto : DTOEntities.MyProductDTO<TEntity, TDto>
        where TEntity : EntityObject
    {

    }
4

3 に答える 3

3

できません。ジェネリック メソッド、型推論:

コンパイラは、渡されたメソッド引数に基づいて型パラメーターを推測できます。制約または戻り値からのみ型パラメーターを推測することはできません。したがって ...

あなたが示した最初のスタイルは型推論を使用していますが、これは単なる便利な省略形です。(ここのように) 型推論が機能しない場合があるため、型パラメーターを明示的に指定する必要があります。

于 2013-02-13T07:57:03.407 に答える
0

TEntity型パラメーターConvertUiToDtoは、型の推論を妨げているものであり、このメソッドを呼び出すときにすべての型パラメーターを明示的に指定する必要があります。残念ながら、この型パラメーターは型制約を設定するために使用されますTDto

where TDto : DTOEntities.LightsailDTO<TEntity, TDto>

この制約が残っている限りTEntity、宣言から削除することはできず、呼び出し時に型推論を使用できませんConvertUiToDto

私にとっての質問は、なぜ型パラメーターがLightsailDTO必要なのですか? TEntityDTO は、エンティティ データを公開せずに転送することを許可するはずではありませんか?

于 2013-02-13T07:57:26.397 に答える
0

私は実際に同様の質問をし、自分で答えを出しました。

型制約を使用してジェネリック型引数を推測できない C# の回避策はありますか?

基本的に、唯一のオプションは、DTO を 2 回渡し、次のように各ジェネリック型パラメーターを個別に推論できるようにすることです。

public static void ConvertUiToDto<TUi, TDto, TEntity>(TUi uiEntity, TDto dtoEntity, DTOEntities.MyProductDTO<TEntity, TDto> dtoEntity2)
    where TDto : DTOEntities.MyProductDTO<TEntity, TDto>
    where TEntity : EntityObject
{

}

そしてそれを次のように呼び出します:

var source = MyProduct.UIEntities.Book.GetBookByID(1);
var target = new MyProduct.DTOEntities.Book();
TypeConverter.ConvertUiToDto(source, target, target);
于 2013-02-13T19:21:11.487 に答える