C#如何批量创建类

  有时候我们会遇到创建大量子类的情况,这些子类基本代码类似,这个时候我们就可以用工具来批量创建。

  比如我要创建以下格式的类:

 private class HeartbeatSend
    {
        public string checkpointAuto;
        public string checkpointId;
        public string chipDate;
        public string flag;
        public string gold;
        public string mapDate;
        public string resinMark;
        public string scienceDate;
        public string sign;
        public string GetSign()
        {
            var _dic = new Dictionary<string, string>();
            _dic.Add("checkpointAuto", checkpointAuto);
            _dic.Add("checkpointId", checkpointId);
            _dic.Add("chipDate", chipDate);
            _dic.Add("flag", flag);
            _dic.Add("gold", gold);
            _dic.Add("mapDate", mapDate);
            _dic.Add("resinMark", resinMark);
            _dic.Add("scienceDate", scienceDate);
            return HttpClient.Inst.GetSign(_dic);
        }
    }

  这是个心跳类,里面包含了用到的数据及一个解析方法。如果每个接口都写一遍就太麻烦了,我们可以用到如下工具脚本。

using System.IO;
using UnityEditor;
using UnityEngine;
using System;
using System.Collections.Generic;

public class NewBehaviourScript : MonoBehaviour
{

    public List<string> allHead = new List<string>();

    public string Name;

    private void Start()
    {
        string _str = "";
        _str += "private class " + Name + "\n" + "{\n";
        foreach (var idx in allHead)
        {
            _str += "public string " + idx + ";\n";
        }

        _str += "public string GetSign()\n{\nvar _dic = new Dictionary<string, string>();\n";
        foreach (var idx in allHead)
        {
            if (idx != "sign")
                _str += "_dic.Add(\"" + idx + "\"," + idx + ");\n";
        }


        _str += "return HttpClient.Inst.GetSign(_dic);\n}\n}";

        StringToTxt("Scenes", Name, _str);
    }

    /// <summary>
    /// 将字符串存储为txt文本
    /// </summary>
    /// <param name="_path">路径</param>
    /// <param name="_name">文本名称</param>
    /// <param name="_str">将要存储的字符串</param>
    /// <param name=""></param>
    public void StringToTxt(string _path, string _name, string _str)
    {
        Debug.Log("开始存储数据");
        AssetDatabase.Refresh();
        Directory.CreateDirectory(_path);
        using (StreamWriter writer = File.CreateText(_path + "/" + _name + ".cs"))
        {
            writer.Write(_str);
        }
        AssetDatabase.Refresh();
        //Debug.Log(gameObject.name + "转表完毕");
    }
}

  拖到物体上,运行即可创建。

  如果有其它格式的,可以自己改改。

  关于错误处理:

  通常由于弱网或者无网络情况下,会出现断网的情况,这个时候可以给post和get再封装一层,用于断网的连接。比如:

   public int Post(string _str, string url, out string _reslut, Action _callback, Action _errorAc)
    {
        var _state = HttpPost(url + _module + "/" + _key, _str, out _reslut);
        if (_state == -1) _errorAc();
        else _callback();
        return _state;
    }

  利用事件来处理错误的方法:

 private Action netAction;
    public void SetNetAction(Action _ac) { netAction = null; netAction = _ac; }
    public void GetNetAction() { netAction?.Invoke(); }

  在错误回调或者返回结果失败的时候,可以将当前方法存储下来,然后打开网络连接失败界面。示例:

  这样就能在合适的时机重新调用该接口。 


版权声明:本文为Tel17610887670原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。