留步帮忙下这样定义是个什么方法 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
来源:学生作业帮助网 编辑:作业帮 时间:2024/07/18 13:13:16
![留步帮忙下这样定义是个什么方法 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](/uploads/image/z/7363312-16-2.jpg?t=%E7%95%99%E6%AD%A5%E5%B8%AE%E5%BF%99%E4%B8%8B%E8%BF%99%E6%A0%B7%E5%AE%9A%E4%B9%89%E6%98%AF%E4%B8%AA%E4%BB%80%E4%B9%88%E6%96%B9%E6%B3%95+public+static+T+CloneObject%28this+T+obj%29+where+T%3Aclass%7B%7Dpublic+static+T+CloneObject%28this+T+obj%29+where+T%3Aclass+%7Bvar+formatter+%3D+new+BinaryFormatter%28%29%3Busing%28MemoryStream+ms+%3D+new+MemoryStream%28%29%29%7Bformatter.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.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{}public static T CloneObject(this T obj) where T:class {var formatter = new BinaryFormatter();using(MemoryStream ms = new MemoryStream()){formatter.Se
这个方法涉及到两个知识点:
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 方法
以上为原理解释,实际运行效果,如一楼“风声正乱”所述,此处不再赘述.