早教吧作业答案频道 -->其他-->
留步帮忙下这样定义是个什么方法 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 方法
以上为原理解释,实际运行效果,如一楼“风声正乱”所述,此处不再赘述.
看了 留步帮忙下这样定义是个什么方...的网友还看了以下:
关于方法重载和方法重写下列说法正确的是()A.方法重载是被重载的方法的参数类型必须不同B.方法重写 2020-05-14 …
留步帮忙下这样定义是个什么方法 public static T CloneObject(this 2020-05-14 …
下面含有非常见的信息系统开发方法体系的是A.原型法、自下而上方法B.自顶向下的方法、面向对象方法 2020-05-23 …
下面不常见的信息系统开发方法体系的是()。A.原型法、自下而上方法B.自顶向下的方法、面向对象方法. 2020-05-23 …
急跪求架设私服的问题!我按照步骤打开了DBC2000之后点左上角第一个Object然后点一下New 2020-06-19 …
“取法乎上,得乎其中;取法乎中,得乎其下;取法呼下,无所得矣。”问出处。”取法乎上得乎其中取法乎中 2020-07-15 …
关于C#结构类型,下列说法哪些是正确的A.结构是值类型,可以使用new关键字创建结构类型的实例B. 2020-07-16 …
在法律规范与法律条文的关系上,下列命题中正确的有A:多数情况下一条法律条文并不罗列法律失落的三个组 2020-07-23 …
constructor必须与class同名,但方法不能与class同名?3.下列说法正确的有()A. 2020-12-06 …
下面说法对法律的理解下面说法对法律的理解错误的有[]A.法律是由国家制定或认可,并靠国家强制力保证实 2020-12-10 …