C# 泛型函数再问

塔克茜丝 2021-03-27 11:58:22
写了一个很丑陋的函数
public void GetDataFromFile<T>(int Type, out List<T> List, out T Object)
{
switch (Type)
{
case 1:
Object = (T)FormatterInformation.Deserialize(FS);
List = null;
break;
case 2:
List = FormatterInformation.Deserialize(FS) as List<T>;
Object = default;
break;
default:
List = null;
Object = default;
break;
}

就是反序列化一个对象或者一组list对象。
怎么用一个泛型函数搞出来呢?
序列化的倒会了。可以重载的。
public void SaveDataToFile <T>(List<T> ListInput)
{
FormatterInformation.Serialize(FS, ListInput);
}
public void SaveDataToFile<T>(T Object)
{
FormatterInformation.Serialize(FS, Object);
}
...全文
852 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
泡泡鱼_ 2021-04-02
  • 打赏
  • 举报
回复
引用 6 楼 wanghui0380 的回复:
封装无效 人家原本就是万能 FormatterInformation.Deserialize(FS); 已经封装好的 你来个type。你说我是程序员,我是愿意用原本就已经封装好的,还是愿意用你的 type=1,type=2
引用 7 楼 wanghui0380 的回复:
也就是说,如果我知道type=1 是list<T>, type=2 是object T 那么我们为啥不直接用通用的,而要去记忆你的1,2,3,4
哈哈,超级喜欢看你拿着实证怒人。想起了osc上的宏哥
引用 10 楼 圣殿骑士18 的回复:
初学者经常把问题搞复杂化,封装了一大堆函数,结果人家类库本已经有简便至极的方法。 如何避免这种问题?对类库的研究不要浅尝辄止,然后来自己的一通发挥。 要抱着“我就不想封装,看你类库能不能够解决我的问题”的想法,想尽办法去折腾类库,榨不出油水了再自己封装。
确实是这样的。其实楼主这个时候应该想一下,既然有序列化方法,会不会就有有反序列化?ide的智能提示就差不多得出答案了。再有经验点的话,第一反应就会先看一下加多‘De’是不是有一个方法了。像加/解密什么的,都这套路了
塔克茜丝 2021-04-02
  • 打赏
  • 举报
回复
多谢回复,受教关贴,我想多了
允许夏天疯狂 2021-04-02
  • 打赏
  • 举报
回复
圣殿骑士18 2021-03-31
  • 打赏
  • 举报
回复
初学者经常把问题搞复杂化,封装了一大堆函数,结果人家类库本已经有简便至极的方法。 如何避免这种问题?对类库的研究不要浅尝辄止,然后来自己的一通发挥。 要抱着“我就不想封装,看你类库能不能够解决我的问题”的想法,想尽办法去折腾类库,榨不出油水了再自己封装。
wanghui0380 2021-03-29
  • 打赏
  • 举报
回复
也就是说,如果我知道type=1 是list<T>, type=2 是object T 那么我们为啥不直接用通用的,而要去记忆你的1,2,3,4
wanghui0380 2021-03-29
  • 打赏
  • 举报
回复
封装无效 人家原本就是万能 FormatterInformation.Deserialize(FS); 已经封装好的 你来个type。你说我是程序员,我是愿意用原本就已经封装好的,还是愿意用你的 type=1,type=2
正怒月神 2021-03-29
  • 打赏
  • 举报
回复
public static T GetDataFromFile<T>(T entity)
        {
            T t = (T)FormatterInformation.Deserialize(FS);
            return t;
        }
杀马特丶蛮牛 2021-03-29
  • 打赏
  • 举报
回复
public T Json2Obj<T>(string jsonStr){ return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonStr); }
晨易夕 2021-03-29
  • 打赏
  • 举报
回复
啊? List<T> 和T有区别吗。 FormatterInformation.Deserialize()函数直接用就行了,你这封装反而整复杂了。
morliz子轩 2021-03-27
  • 打赏
  • 举报
回复
引用 楼主 塔克茜丝 的回复:
写了一个很丑陋的函数 public void GetDataFromFile<T>(int Type, out List<T> List, out T Object) { switch (Type) { case 1: Object = (T)FormatterInformation.Deserialize(FS); List = null; break; case 2: List = FormatterInformation.Deserialize(FS) as List<T>; Object = default; break; default: List = null; Object = default; break; } 就是反序列化一个对象或者一组list对象。 怎么用一个泛型函数搞出来呢? 序列化的倒会了。可以重载的。 public void SaveDataToFile <T>(List<T> ListInput) { FormatterInformation.Serialize(FS, ListInput); } public void SaveDataToFile<T>(T Object) { FormatterInformation.Serialize(FS, Object); }
直接继承LocalizedTypeGetter

public class LocalizedTypeGetterEx : LocalizedTypeGetter
{
    public override Type BindToType(string assemblyName, string typeName)
    {
        if (typeName.Contains("List") == true && typeName.Contains(typeof(Student).Name) == true)  // 如果是泛型集合
        {
            return typeof(List<Student>);  // 直接返回反序列化的类型
        }

        return base.BindToType(assemblyName, typeName);
    }
}

//或者使用 XmlSerializer ,将要拷贝的对象序列化到流中,然后通过反序列化得到新的对象。
  /// <summary>
  /// 序列化类
  /// </summary>
  public class SerializLog
  {
    //1.使用序列化的方式完成 引用对象的 深复制 是最好的方式
    //2.下面的 Clone方法,我需要使用 泛型对象 做为参数,则在 Clone后面需要带上<T>的声明,否则编译出错
    
    public static T Clone<T>(T realObject) // T 要序列化的对象
    {
      using (Stream stream = new MemoryStream()) // 初始化一个 流对象
      {
        XmlSerializer serializer = new XmlSerializer(typeof(T)); //将要序列化的对象序列化到xml文档(Formatter)
        serializer.Serialize(stream, realObject); //将序列后的对象写入到流中
        stream.Seek(0, SeekOrigin.Begin);     
        return (T)serializer.Deserialize(stream);// 反序列化得到新的对象
      }
    }
  }


  • 打赏
  • 举报
回复
同样序列化也只需要一个方法,不需要重载 public void SaveDataToFile(object Object) { FormatterInformation.Serialize(FS, Object); } 或者 public void SaveDataToFile<T>(T Object) { FormatterInformation.Serialize(FS, Object); } 就可以满足要求,不需要SaveDataToFile <T>(List<T> ListInput)
  • 打赏
  • 举报
回复
不清楚你的具体方法,看你发的代码改成下面的应该就可以了,T是可以是List<>集合或者对象的不用专门定义List<T> public void GetDataFromFile<T>(out T Object) { Object= (T)FormatterInformation.Deserialize(FS); } 调用 集合 GetDataFromFile(out List<xxx> obj) 对象 GetDataFromFile(out xxx obj)

110,531

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧