之前的文章中提到,通过自定义的ObjectMap方法可以将Tfrom类型的对象转化为Tto类型的对象,
但是如果我们需要将List<Tfrom>转化为List<Tto>呢,将ObjectMap方法塞入循环,但是结果却会使List<Tto>集合中的对象都是同一个,
原因很简单,传入ObjectMap方法的toEntity对象从开始到结束都没有被new过,用的都是同一个,因此作为引用类对象,很容易就会使整个list的值变得相同。
对于这个问题,我们有了以下2个解决方案:
首先定义两个需要转换的类以及其属性:
public class ClassA
{
public object propertA { get; set; }
}
public class ClassB
{
public object propertB { get; set; }
}
方案一:利用linq的select方法执行委托实现转换
/// <summary>
/// PlayTList
/// </summary>
public void PlayTList()
{
//定义源数据集合,即List<TFrom>
List<ClassA> classAList = new List<ClassA>();
//将List<TFrom>转换为List<TTo>,委托的this.PlayTListSelector中我们调用之前讲到的GenerateTFromToEntity方法
List<ClassB> classBList = classAList.Select<ClassA, ClassB>(this.PlayTListSelector).ToList();
}
/// <summary>
/// PlayTListSelector
/// </summary>
/// <param name="aObject">ClassA的对象</param>
/// <returns>ClassB的对象</returns>
private ClassB PlayTListSelector(ClassA aObject)
{
//这里调用ObjectMap方法,因为每次调用中,TTo的对象都会被new,即new ClassB()
//因此不会造成集合中数据相同的情况
return this.GenerateTFromToEntity<ClassA, ClassB>(aObject, new ClassB());
}
以上方法中我们实现了对List<T>的转换,但是方法过于针对,即并没有达到很腻害得共同,
如果我们有9999个class中都需要进行这样的转换,那就等于我们需要将PlayTListSelector方法写9999次,
当然PlayTListSelector方法是否可以写成充满T的方法呢,答案未知,因为至今在select方法中尝试T套用的方式失败了,因此目前Selector还不能做成充满T的淫荡表达式。
因此我们想到,上述方法中的ClassA是通过直接定义生成的,但是通常情况下,我们的源集合都是要通过一些方法调用来生成,因此,考虑在生成ClassA集合的过程中,将里面的子对象直接转化为ClassB然后拼合成ClassB集合进行输出,那就可以达到共通的目的:
方案二:通过对集合类的克隆,实现目的
首先我们需要定义个父类并实现ICloneable接口
public class TBase :ICloneable
{
/// <summary>
/// 实现克隆方法
/// </summary>
/// <returns></returns>
#region ICloneable Members
public object Clone()
{
return this.MemberwiseClone();
}
#endregion
}
接着,我们原先的ClassA与ClassB就变成了:
public class ClassA : TBase
{
public object propertA { get; set; }
}
public class ClassB : TBase
{
public object propertB { get; set; }
}
最后我们的方法就变成了:
/// <summary>
/// PlayTList
/// </summary>
public void PlayTList()
{
//直接通过GenerateClassBList方法来生成classBList
List<ClassB> classBList = this.GenerateClassBList();
}
/// <summary>
/// GenerateClassBList
/// </summary>
/// <returns></returns>
public List<ClassB> GenerateClassBList()
{
//定义ClassA的对象,在通常情况下,我们需要很多方法来生成这个对象,在这里就简化了
var classAobject = new ClassA();
//定义classBList集合作返回值
var classBList = new List<ClassB>();
//调用GenerateTFromToEntity方法来将classAobject对象转化为ClassB的对象,并且实现clone方法
classBList.Add((ClassB)this.GenerateTFromToEntity<ClassA, ClassB>(classAobject, new ClassB()).Clone());
return classBList;
}
这样就不需要在每个class中都定义转换的方法了。