ToViewModel类型函数(MVVM)的泛型解决方案

时间:2016-03-18 14:46:51

标签: c# mvvm

如何使用C#泛型来避免为每个自动生成的类(Linq to SQL DBML)创建类似的扩展函数?

var characters = new ObservableCollection<CharacterViewModel>(from p in DB.Characters
                                                              select p.ToViewModel());

拥有这样的函数提供了一种相当简洁的方法,可以从数据库中选择一组项目作为相应的ViewModel,如下所示:

static public T ToViewModel<T,K>(K dbmlClass)
{
     return new T(dbmlClass);
}

我希望看到类似的内容:

public class BaseDO<T>: BaseDO
{
    public BaseDO(T model)
    {
        Model = model;
    }

    public T Model { get; set; }
}

abstract public class BaseDO: INotifyPropertyChanged, INotifyDeleted
{

    #region Standard INotifyPropertyChanged Implementation

    public void NotifyPropertyChanged(string propertyName)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged = (o, e) => { };
    #endregion


    public event EventHandler OnEntityDeleted = (o, e) => { };

    public void NotifyEntityDeleted()
    {
        OnEntityDeleted(this, new EventArgs());
    }
}

public interface INotifyDeleted
{
    event EventHandler OnEntityDeleted;
    void NotifyEntityDeleted();
}

但是我觉得这将涉及反射式对象生成,我不知道它的效率(或如何实现它)。

顺便说一下,我之前曾调查过运算符重载分配(&#39; =&#39;)作为可能的解决方案,这可能会提供隐式转换,但我相信这需要重载=生成的课程,我无法做到。

更新

谢谢大家,谢谢。我想我现在有一些途径可以退房。为了提供更多的背景,正如一些人提到的那样,它并不清楚。我的所有ViewModel都来自以下内容:

{{1}}

2 个答案:

答案 0 :(得分:0)

您可以使用Automapper等库。有了这个,您可以在其中设置一个如何映射对象的配置。然后你可以:

public static T ToViewModel<T,K>(K dbmlClass) 
{
    return AutoMapper.Mapper.Map<T>(dbmlClass); 
}


// Register mappings
public static void ConfigureMappings()
{
    AutoMapper.Mapper.CreateMap<Character, CharacterViewModel>();
}

答案 1 :(得分:0)

从您的问题中,您是否想要自动生成视图模型类,或者您是否已经编写它们并且每个人都接受模型作为构造函数参数,这一点并不十分清楚。如果是前者,那么我个人使用Castle Proxy或Frody将INPC添加到模型类中。如果是后者,那么我相信这就是你所追求的:

public static class Helper
{
    static public T ToViewModel<T>(this object dbmlClass)
    {
        return (T)Activator.CreateInstance(typeof(T), dbmlClass);
    }
}

然后你会像这样使用:

var model = new Model();
var view_model = model.ToViewModel<ViewModel>();