[Play with T]_[C# 类与属性操作] 通过克隆实现ObjectMap对List的填充

之前的文章中提到,通过自定义的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中都定义转换的方法了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值