using System;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;
using System.Runtime.Serialization;
using System.Collections.Concurrent;
using System.Collections.Generic; namespace study
{
public class Program
{
static void Main(string[] args)
{
Show s = new Show();
s.ShadowCopy();
} public class Show
{
public void ShadowCopy()
{
TestData testData = new TestData { Name = "A", Count = 1 };
TestData cloneTestData = testData.CloneEntity();
bool same = testData.Equals(cloneTestData);
int i=testData.Name.WordCount();
Console.WriteLine(same);
Console.WriteLine(i);
testData.Name.Print(); Console.ReadKey();
} public void DeepCopy()
{
Entity entity = new Entity { Name = "Bruce", Line = 1 };
Entity cloneEntity = entity.Clone();
bool same = entity.Equals(cloneEntity);
Console.WriteLine(same);
List<Entity> list = new List<Entity>();
list.Add(new Entity { Name = "Bruce", Line = 1 });
list.Add(new Entity { Name = "Jack", Line = 2 });
list.Add(new Entity { Name = "Rose", Line = 3 });
list.Add(new Entity { Name = "Tony", Line = 4 });
List<Entity> cloneList = list.Clone();
foreach (var item in cloneList)
{
Console.WriteLine(item.Name+" "+item.Line);
} Console.ReadKey();
}
} #region 共通复制实体类的方法测试
public class TestData : TestBase
{
public string Name { get; set; }
public int Count { get; set; }
} public class TestBase
{
public object CloneObject()
{
return this.MemberwiseClone();
}
}
/// <summary>
/// 1、定义一个静态类以包含扩展方法。该类必须对客户端代码可见。
/// 2、将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。
/// 3、该方法的第一个参数指定方法所操作的类型;该参数必须以 this 修饰符开头。
/// 4、在调用代码中,添加一条 using 指令以指定包含扩展方法类的命名空间。
/// 5、按照与调用类型上的实例方法一样的方式调用扩展方法。
/// </summary>
public static class TestClone
{
public static T CloneEntity<T>(this T org) where T : TestBase
{
return (T)org.CloneObject();
}
public static int WordCount(this String str)
{
return str.Split(new char[] { ' ', '.', '?' }, StringSplitOptions.RemoveEmptyEntries).Length;
}
public static void Print(this String str)
{
Console.WriteLine(str);
}
}
#endregion public static class DeepClone
{
public static T Clone<T>(this T t)
{
return (T)CloneObject(t);
} private static object CloneObject(object obj)
{
using (MemoryStream memStream = new MemoryStream())
{
BinaryFormatter binaryFormatter = new BinaryFormatter(null, new StreamingContext(StreamingContextStates.Clone));
binaryFormatter.Serialize(memStream, obj);
memStream.Seek(0, SeekOrigin.Begin);
return binaryFormatter.Deserialize(memStream);
}
}
} /// <summary>
/// 被克隆的类必须标记为可序列化
/// </summary>
[Serializable]
public class Entity
{
public string Name { get; set; }
public int Line { get; set; }
}
}

  

C# 扩展方法克隆实体类的更多相关文章

  1. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  2. 用UseMiddleware扩展方法注册中间件类

    用UseMiddleware扩展方法注册中间件类 .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件 ...

  3. 提升开发效率的notepad++一些快捷方法(实体类的创建和查询sql语句的编写)

    新手要创建数据库表中,对应字段名的实体类,是不是感觉很麻烦,可以用notepad++快速的把实体类中的字段名进行排版,随后直接粘入idea使用 下面是navicat的演示 选择一个表,右键选择设计表 ...

  4. .net core 2使用ef core 2.0以db first方法创建实体类

    先安装以下三个包: Install-Package Microsoft.EntityFrameworkCore.SqlServer Install-Package Microsoft.EntityFr ...

  5. mybatis主键返回语句 使用方法,就是实体类.getid即可拿到返回的id

    <insert id="insertSelective" parameterType="com.o2o.Content" useGeneratedKeys ...

  6. .NET手记-定义类和接口的扩展方法

    对于iOS开发者来说,使用扩展方法是家常便饭.因为有很多的类是有系统框架的定义的,我们不能修改或者不想修改他们的源码,但是我们又想要给他添加一些扩展方法来使用.这时定义扩展方法就是很有用的方式了,正如 ...

  7. 【springboot】【idea】实体类免写get、set等方法,使用lombok依赖和插件的@Data类注解

    需求,一个实体类,规范写法一定要对应的get.set方法,有必要还要重写toString方法.虽然可以快速生成get.set等方法,但是如果要添加或减少成员属性时就得重新生成get.set等方法. 而 ...

  8. EF里查看/修改实体的当前值、原始值和数据库值以及重写SaveChanges方法记录实体状态

    本文目录 查看实体当前.原始和数据库值:DbEntityEntry 查看实体的某个属性值:GetValue<TValue>方法 拷贝DbPropertyValues到实体:ToObject ...

  9. C#扩展方法知多少

    前言:上篇 序列化效率比拼——谁是最后的赢家Newtonsoft.Json 介绍了下序列化方面的知识.看过Demo的朋友可能注意到了里面就用到过泛型的扩展方法,本篇打算总结下C#扩展方法的用法.博主打 ...

随机推荐

  1. (五)JS学习笔记 - JQuery缓存机制

    历史背景 开发中常常因为方便,把状态标志都写到dom节点中,也就是HTMLElement,缺点: 循环引用 直接暴露数据,安全性? 增加一堆的自定义属性标签,对浏览器来说是没意义的 取数据的时候要对H ...

  2. 让Mac OS X中的PHP支持GD

    GD库已经是近乎于是现在主流PHP程序的标配了,所以也必须让Mac OS X中的PHP支持GD.在网上搜索了好多,最终按照这个方式成功实现,如何让Mac OS X支持PHP,请查看<让PHP跑在 ...

  3. Mysql中natural join和inner join的区别

    假设有如下两个表TableA,TableB TableA TableB Column1 Column2 Column1 Column3 1 2 1 3 TableA的Column1列名和TableB的 ...

  4. Symfony2中的设计模式——装饰者模式

    装饰者模式的定义  文章链接:http://www.hcoding.com/?p=101 个人站点:http://www.hcoding.com/ 在不必改变原类文件和使用继承的情况下,动态地扩展一个 ...

  5. Python新手学习基础之运算符——算术运算符

    算术运算符 之前文章在介绍变量类型的时候,其实已经用过了很多算术符,比如+.-.*././/.** 等,除此之外,还有一个符号是之前内容没提到的,就是 % ,用来返回除法余数的运算符号. 假设有变量x ...

  6. Excel文件数据保存到SQL中

    1.获取DataTable /// <summary> /// 查询Excel文件中的数据 /// </summary> /// <param name="st ...

  7. win7下的iis配置

    1.配置错误 说明:在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息并适当地修改配置文件. 分析器错误消息:无法识别的属性“targetFramework”.请注意属性名称区分 ...

  8. Jetty开发(2)

    部署web应用 配置了部署模块的Jetty服务器实例能够在webapps目录下热部署web应用.在webapps目录下标准的War包和jetty的配置文件能够被热部署进服务器需要符合下述规则: exa ...

  9. 解决比较Oracle中CLOB字段问题

    解决比较Oracle中CLOB字段问题   Oracle中CLOB和BLOB字段虽说在开发中满足了存放超大内容的要求,但是在一些简单使用中确频频带来麻烦.CLOB中存放的是指针,并不能直接取到实际值. ...

  10. MVC4.0系统开发新手历程(四)数据列表查询

    任何系统都不可避免的就是数据的查询展示,我觉得这里最值得一说的就是分部视图以及数据分页了 首先添加控制器 在控制其上面的名字为Index的Action上面右击,添加视图即可添加对应的视图,分部视图呈现 ...