Я изучаю 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% правильно. Возможно ли это, что я делаю? Если нет, то какой лучший способ получить эту функциональность?
Вам нужно добавить противопоказания:
public class ModelViewModelBase<T> : DependencyObject, IModelViewModel<T> where T:Model, new()
(предполагая, что Model
является базовым классом для ваших моделей)