早教吧作业答案频道 -->其他-->
留步帮忙下这样定义是个什么方法 public static T CloneObject(this T obj) where T:class{}public static T CloneObject(this T obj) where T:class {var formatter = new BinaryFormatter();using(MemoryStream ms = new MemoryStream()){formatter.Se
题目详情
留步帮忙下这样定义是个什么方法 public static T CloneObject(this T obj) where T:class{}
public static T CloneObject(this T obj) where T:class
{
var formatter = new BinaryFormatter();
using(MemoryStream ms = new MemoryStream())
{
formatter.Serialize(ms,obj);//写完后操作位置到了最后!
ms.Seek(0,SeekOrigin.Begin);//很重要,将流操作位置设置到起始位置
T clonedObj = (T) formatter.Deserialize(ms);
return clonedObj;
}
}
public static T CloneObject(this T obj) where T:class
{
var formatter = new BinaryFormatter();
using(MemoryStream ms = new MemoryStream())
{
formatter.Serialize(ms,obj);//写完后操作位置到了最后!
ms.Seek(0,SeekOrigin.Begin);//很重要,将流操作位置设置到起始位置
T clonedObj = (T) formatter.Deserialize(ms);
return clonedObj;
}
}
▼优质解答
答案和解析
这个方法涉及到两个知识点:
1)泛型
2)扩展方法
先抛开“扩展方法”不提,这个方法属于“泛型方法”(注意:不是泛型类).
以下为简单示例:
public static T ToString(T obj)
{
return obj.ToString();
}
假设调用:
ToString(2);
等效于:
public static int ToString(int obj) // 原来的 T 被替换为 int
{ return obj.ToString(); }
假设调用
ToString("MyString");
等效于:
public static string ToString(string obj) // 原来的 T 被替换为 string
{ return obj.ToString(); }
通过以上例子可以看出,泛型参数 T 其实就是一个“类型占位符”,在编译时或运行时动态的替换为实际数据类型.我想你现在可以大致理解泛型方法了吧?
最后备注:where T :class 表示约束泛型参数 T 必须是引用类型,不能是值类型.
扩展方法:
是指在某个类型上,扩展出一个方法(属于编译技术,俗称:语法糖).
CloneObject(this T obj) 意思,是指在类型 T 上扩展一个 CloneObject 方法.
这个 T 是泛型参数:
1)如果泛型参数是 string 则表示在 string 上扩展 CloneObject 方法
2)如果泛型参数是 ArrayList 则表示在 ArrayList 上扩展 CloneObject 方法
3)如果泛型参数是其它 XXXXX 类,则表示在 XXXXX 类上扩展 CloneObject 方法
以上为原理解释,实际运行效果,如一楼“风声正乱”所述,此处不再赘述.
1)泛型
2)扩展方法
先抛开“扩展方法”不提,这个方法属于“泛型方法”(注意:不是泛型类).
以下为简单示例:
public static T ToString(T obj)
{
return obj.ToString();
}
假设调用:
ToString(2);
等效于:
public static int ToString(int obj) // 原来的 T 被替换为 int
{ return obj.ToString(); }
假设调用
ToString("MyString");
等效于:
public static string ToString(string obj) // 原来的 T 被替换为 string
{ return obj.ToString(); }
通过以上例子可以看出,泛型参数 T 其实就是一个“类型占位符”,在编译时或运行时动态的替换为实际数据类型.我想你现在可以大致理解泛型方法了吧?
最后备注:where T :class 表示约束泛型参数 T 必须是引用类型,不能是值类型.
扩展方法:
是指在某个类型上,扩展出一个方法(属于编译技术,俗称:语法糖).
CloneObject(this T obj) 意思,是指在类型 T 上扩展一个 CloneObject 方法.
这个 T 是泛型参数:
1)如果泛型参数是 string 则表示在 string 上扩展 CloneObject 方法
2)如果泛型参数是 ArrayList 则表示在 ArrayList 上扩展 CloneObject 方法
3)如果泛型参数是其它 XXXXX 类,则表示在 XXXXX 类上扩展 CloneObject 方法
以上为原理解释,实际运行效果,如一楼“风声正乱”所述,此处不再赘述.
看了 留步帮忙下这样定义是个什么方...的网友还看了以下:
关于求出13-23+33-43.973-983+993-1003的值的问题,请教下为什么我的代码是 2020-05-13 …
留步帮忙下这样定义是个什么方法 public static T CloneObject(this 2020-05-14 …
class CWinApp { public:CWinApp* m_pcurrentWinApp; 2020-05-14 …
class A{ int a; public:A(const A& rhs){.} A b=(*t 2020-05-14 …
计算圆周率PI=4-4/3+4/5-4/7..打印出第一个大于3.1415小于3.1416的值想问 2020-05-16 …
会c#的麻烦进来帮下忙using System;using System.Collections. 2020-05-16 …
一个派生类去继承两个基类,但两个基类中有同名函数,于是在派生类中有歧义,形如:class ABC{ 2020-05-16 …
● 下面是一段 javabean 程序,该程序的运行结果是 (62) 。 public class 2020-05-26 …
下面是一段javabean程序,该程序的运行结果是(62)。 public class NullTe 2020-05-26 …
java 画矩形package testFrame;import java.awt.Color;i 2020-06-27 …