我一直在学习泛型,并且对它有一些很好的理解。基本上,泛型似乎是在运行时确定的某种类型的占位符。一般是字母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;
}
现在我试图把它用在我想用于所有 View 模型的基类中。假设我有一个名为
IModelViewModel
的接口(interface)(任何 EF 模型类的 View 模型)public interface IModelViewModel<T>
{
T Model { get; set; }
bool IsNewRecord { get; set; }
void ConvertModelToViewModel();
void UpdateModelFromViewModel();
void SaveToDb();
void UpdateInDb();
}
我的逻辑是,任何为表示来自 EF 的直接 poco 而创建的 View 模型都必须具有
Model
保存原始 EF Poco 的属性,一个 bool 值,指示它是否是要添加的新记录,一个转换为 ViewModel 的方法(它基本上通过模型填充 this
viewmodel 的属性,一个 UpdateModelFromViewModel 方法从 View 中更新模型 -有界 View 模型,一个保存方法和一个更新方法。在这种情况下,T 是为了抽象接口(interface),以便它可以容纳 任何我放入的 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 对象作为它的模型属性。构造类时, bool 值
IsNewRecord
必须根据 EF Poco 的状态来设置。由于我没有使用 100% 正确的泛型,因此该类本身不起作用。这甚至可能是我在做什么?如果不是,那么获得此功能的最佳方法是什么?
最佳答案
您需要添加约束:
public class ModelViewModelBase<T> : DependencyObject, IModelViewModel<T> where T:Model, new()
(假设
Model
是模型的基类)
关于c# - 用泛型抽象一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846759/