如何使用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}}
答案 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>();