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. easyui之datagrid(不定时补充)

    1,datagrid之formatter formatter格式化函数有三个参数: value:字段值(一般为后台传递给前台的值): row:当前行数据: index:当前行索引. return值是显 ...

  2. ThinkPHP整合百度Ueditor

    文章来源:http://www.thinkphp.cn/code/267.html ThinkPHP整合百度Ueditor,基于黄永成老师的视频说明的申明:最好大家都能写绝对路径的都写好绝对路径比如: ...

  3. Repeater绑定数据库

    前台: <table width="> <tr> <td class="tr1"> <asp:Label Text=" ...

  4. JS 操作一个数据值

    任何语言都有自己的操作数据的方法: Js也不例外,js有3种重要的方式来操作一个数据值. 1>复制它.例如把它赋给一个新的变量. 2>把它作为参数传递给一个函数或方法. 3>可以和其 ...

  5. JSP(二)

    一.pageContext对象    1>代表当前JSP页面的运行环境, [作用域仅仅局限于当前JSP页面中,出了该JSP页面, 原PageContext域对象被销毁]    2>封装了对 ...

  6. 自制单片机之十七……PC与单片机RS-232串口的通讯和控制

    这次我们来试着一步步的去掌握PC与单片机通过RS-232进行通讯和控制. 先说说我硬件的情况.我用的PC是个二手的IBM240小本本,十寸屏,赛扬400,机子很老了.但也有它的优点:1.串口,并口,P ...

  7. 关于Windows高DPI的一些简单总结(Window上一般默认是96 dpi 作为100% 的缩放比率)

    我们知道,关于高DPI的支持, Windows XP时代就开始有了, 那时关于高DPI的支持比较简单, 但是从Vista/Win7 到现在Win8 /Win8.1, Windows关于高DPI的支持已 ...

  8. 新技术:Qt for Native Client (and emscripten)

    http://blog.qt.io/blog/2015/09/25/qt-for-native-client-and-emscripten/

  9. EXTJS4:在grid中加入合计行

    extjs4很方便的实现简单的合计(针对在不分页的情况下): 它效果实现在:Ext.grid.feature.Summary这个类中 Ext.define('TestResult', { extend ...

  10. wan口mac=lan口mac加一,wlan是lan口mac加二

    (1)路由器有两个mac地址,一个用于外网(wan),一个用于内网(wlan和lan): (2)一般路由器上面或者配置路由器的网页上面只标注外网的mac地址: (3)内网的mac地址和外网mac地址一 ...