用泛型抽象类
本文关键字:抽象类 泛型 | 更新日期: 2023-09-27 18:05:02
我一直在学习泛型,对它有一些很好的理解。基本上,泛型似乎是在运行时确定的特定类型的占位符。一般来说,字母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
的接口(任何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
视图模型的属性,一个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对象作为它的模型属性。在构造类时,必须根据EF Poco的状态设置布尔值IsNewRecord
。类本身不工作,由于我没有使用泛型100%正确的事实。我所做的一切有可能吗?如果没有,获得此功能的最佳方法是什么?
您需要添加约束:
public class ModelViewModelBase<T> : DependencyObject, IModelViewModel<T> where T:Model, new()
(假设Model
是模型的基类)