用泛型抽象类

本文关键字:抽象类 泛型 | 更新日期: 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是模型的基类)