我一直在学习泛型并对它有一些很好的理解。基本上,似乎泛型是在运行时确定某种类型的占位符。通常,字母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;
}
现在我试图将它用于我想要用于所有viewmodel的基类中。假设我有一个名为IModelViewModel
的接口(任何EF模型类的视图模型)
public interface IModelViewModel<T>
{
T Model { get; set; }
bool IsNewRecord { get; set; }
void ConvertModelToViewModel();
void UpdateModelFromViewModel();
void SaveToDb();
void UpdateInDb();
}
我的逻辑是,为了表示来自EF的直接poco而创建的任何视图模型必须具有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对象作为它的model属性。构造类时,必须根据EF Poco的状态设置布尔值IsNewRecord
。由于我没有使用100%正确的泛型,因此该类本身无法正常工作。这甚至可能是我在做什么?如果没有,那么获得此功能的最佳方式是什么?
答案 0 :(得分:2)
您需要添加约束:
public class ModelViewModelBase<T> : DependencyObject, IModelViewModel<T> where T:Model, new()
(假设Model
是模型的基类)