gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:44:09 24 4
gpt4 key购买 nike

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

static public CharacterViewModel ToViewModel(this Character c)
{
return new CharacterViewModel(c);
}

具有这样的功能提供了一种非常干净的方法,可以从数据库中选择一组项目作为其对应的ViewModel,如下所示:
var characters = new ObservableCollection<CharacterViewModel>(from p in DB.Characters
select p.ToViewModel());

我想看到类似的东西:
static public T ToViewModel<T,K>(K dbmlClass)
{
return new T(dbmlClass);
}

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

顺便说一句,我之前确实研究过运算符重载赋值('=')作为可能的解决方案,它可以提供隐式转换,但是我认为这将需要重载自动生成类中的=,而我无法这样做。

更新

谢谢大家的回答。我想我现在有几种方法可以退房。正如一些人提到的那样,要提供更多的上下文还不清楚。我所有的ViewModel均源自以下内容:
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();
}

最佳答案

您可以使用Automapper之类的库。有了这个,您可以在1个地方设置如何映射对象的配置。然后,您可以:

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>();
}

关于c# - ToViewModel类型函数(MVVM)的泛型解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36087358/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com