Абстрагирование класса с помощью дженериков

1

Я изучаю Generics и хорошо понимаю его. В принципе, похоже, что генерики являются заполнитель для определенного типа, который будет определен во время выполнения. Обычно буква T обозначает общий, но не ограничивается только буквой/именем.

Поэтому, повторно изобретая колесо, которое у меня может быть, может быть метод, который может преобразовывать любой тип списка в массив, например, так

public static T[] ConvertListToArray<T>(List<T> list) {
    int count = list.Count;
    T[] array = new T[count];
    for (int i = 0; i < count; i++)
        array[i] = list[i];
    return array;
}

Теперь я пытаюсь использовать это для использования в базовом классе, который я хочу использовать для всех моих моделей просмотра. Скажем, у меня есть интерфейс с именем IModelViewModel (viewmodel для любого класса модели EF)

public interface IModelViewModel<T>
{
    T Model { get; set; }

    bool IsNewRecord { get; set; }

    void ConvertModelToViewModel();

    void UpdateModelFromViewModel();

    void SaveToDb();

    void UpdateInDb();
}  

Моя логика заключается в том, что любая модель представления, созданная для представления прямого poco из EF, должна иметь свойство Model для хранения исходного EF Poco, логического значения, указывающего, будет ли это новая запись, конвертировать в метод ViewModel (который в основном заполняет this свойства viewmodel с помощью модели, метод UpdateModelFromViewModel, который обновляет модель из модели с ограниченным представлением, метод сохранения и метод обновления. В этом случае T предназначен для абстрагирования интерфейса, чтобы он мог содержать любые poco, которые я вставлял в Это.

Теперь вот базовый класс.

public class ModelViewModelBase<T> : DependencyObject, Interfaces.IModelViewModel<T>
{
    public T Model { get; set; }
    public bool IsNewRecord { get; set; }

    public ModelViewModelBase(T model)
    {
        if (model == null || model.id == 0)
        {

            this.IsNewRecord = true;
            Model = new T();
        }
        else
        {
            this.IsNewRecord = false;
        }
    }


    public void ConvertModelToViewModel()
    {
        throw new NotImplementedException();
    }

    public void UpdateModelFromViewModel()
    {
        throw new NotImplementedException();
    }

    public void SaveToDb()
    {
        throw new NotImplementedException();
    }

    public void UpdateInDb()
    {
        throw new NotImplementedException();
    }
}  

Идея заключается в следующем: каждый дочерний класс ModelViewModel должен иметь объект EF poco в качестве свойства модели. Когда класс построен, булевский IsNewRecord должен быть установлен в соответствии с состоянием EF Poco. Сам класс не работает из-за того, что я не использую дженерики на 100% правильно. Возможно ли это, что я делаю? Если нет, то какой лучший способ получить эту функциональность?

Теги:
generics
entity-framework
wpf
mvvm

1 ответ

2
Лучший ответ

Вам нужно добавить противопоказания:

public class ModelViewModelBase<T> : DependencyObject, IModelViewModel<T> where T:Model, new()

(предполагая, что Model является базовым классом для ваших моделей)

  • 0
    Ааа, получил тебя. Поэтому здесь мы ограничиваем типы базовым классом, используемым для моих моделей EF. Поскольку я использую подход, основанный на базе данных, иметь производные модели от базы было бы плохо. Может быть, я могу сделать частичный класс для каждого и вместо этого получить эти производные.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню