2

基本クラスを継承するビュー モデル (MVC4 を使用) があります。

public class TimeTaskViewModel : TimeDetailTask
{
    public string TaskTypeDescription { get; set; }

}

そのクラスのインスタンスを指定して、ビューモデルをクラスに変換するメソッドがあります。基本クラスのすべてのプロパティを明示的に設定する必要がないように、次のようなことができるようにしたいと思います。その後、ビュー モデルの追加のプロパティを更新するだけです。

public TimeTaskViewModel ConvertClassToViewModel(TimeDetailTask entity)
{
    TimeTaskViewModel viewModel = new TimeTaskViewModel();

    viewModel.base = entity; 
    viewModel.TaskTypeDescription = entity.TaskTypes.TaskTypeDescription;
    return viewModel;
}

とにかくそうするには?それとも私はここの基地から離れていますか?

注: ビュー モデルも IEnumerable 形式で使用されてフロント エンドの Kendo UI Grid に渡され、複雑なクラスを処理できないため、結果としてフラット クラスが必要です。

4

3 に答える 3

3

いいえ、あなたが求めているとおりに正確に行うことはできません。以下にいくつかのオプションを示します。

1: クラスを変更して、クラスを拡張するのでTimeTaskViewModelはなく、クラスを含むようにします。TimeDetailTask

public class TimeTaskViewModel
{
    public TimeDetailTask TimeDetailTask { get; set; }
    public string TaskTypeDescription { get; set; }
}

2:TimeTaskViewModel(TimeDetailTask)コンストラクターを作成し、そこに手動でプロパティをコピーします。

public class TimeTaskViewModel : TimeDetailTask
{
    public string TaskTypeDescription { get; set; }
    public TimeTaskViewModel(TimeDetailTask baseTask)
    {
        this.SomeProperty = baseTask.SomeProperty;
        // and so on
    }
}

3: AutoMapper、リフレクション、または同様のものを使用して、あるプロパティから別のプロパティにコピーします。

Mapper.CreateMap<TimeDetailTask, TimeTaskViewModel>();

// Perform mapping

TimeTaskViewModel viewModel = 
                       Mapper.Map<TimeDetailTask, TimeTaskViewModel>(baseTask);
于 2013-07-31T18:09:09.210 に答える
2

あるクラスから、たまたま同じプロパティを持つまったく別のクラスに情報をマッピングする簡単な方法を探しているようです。継承はあなたが探している答えではないと思います。あるオブジェクトから別のオブジェクトにプロパティをマッピングするためのルールを設定できるAutoMapperのようなものが必要なようです。

たとえば、データベースに書き込む前にビュー モデルからデータベース エンティティにマップしようとしている場合は、次のようにします。

var entity = Mapper.Map(viewModel);

プロパティ名の直接一致の場合、AutoMapper は、たとえば TimeTaskViewModel.TaskTypeDescription を YourEntity.TaskTypeDescription にコピーするなど、すでに処理を行っています。ただし、名前が完全に一致しない場合や、データを操作する必要がある場合 (文字列を int にキャストするなど) は、マップ ファイルでルールを設定できます。

私の意見では、AutoMapper は、あるプロパティ名を持つクラスからまったく同じプロパティ名を持つ別のクラスにコピーするために使用する場合に優れたツールです。異なる名前のプロパティ間で同じデータ型をコピーする必要がある場合や、非常に単純な変換 (int から string への変換など) を実行する必要がある場合は、それでも問題ないツールです。ただし、複雑な変換を行う価値がある場合は、より面倒だと感じ始めます (主に、マッピング ファイルのデバッグと単体テストが難しいため)。その時点で、独自のマッピング関数を作成する必要があるように感じることがよくあります。 . もちろん、単純なケースでは使用できず、より複雑なケースでは独自のマッピング関数を使用できないということはありません。

于 2013-07-31T18:08:02.927 に答える
0

これを試して

//TimeTaskViewModel クラスで TimeDetailTask​​ のプロパティを作成します

public class TimeTaskViewModel : TimeDetailTask
{
    public string TaskTypeDescription { get; set; }

   public TimeDetailTask TimeDetailTaskProperty { get; set; }
}

//Then you assign the entity values to modelclass  TimeDetailTaskProperty 

public TimeTaskViewModel ConvertClassToViewModel(TimeDetailTask entity)
{
    TimeTaskViewModel viewModel = new TimeTaskViewModel ();    
    viewModel.TimeDetailTaskProperty =entity;
    return viewModel;
}

TimeDetailTaskProperty //最後に、を使用してこれから値を取得できますTimeTaskViewModel object

于 2013-07-31T18:16:43.013 に答える