c#中实现的万能变量类

c#里面有一个很好的机制一切对象都继承自Object

废话少说直接上代码:第一个类Varient.cs文件

using System;
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

/// <summary>
/// 公用的容器
/// </summary>
public class Variant
{
    public bool isNull
    {
        get{return m_value == null;}
        set{if (value == true){m_value = null;}}
    }

    public void set_bool(bool b)
    {m_value = b;}

    public void set_value(double b)
    {m_value = b;}

    public void set_int(int b)
    { m_value = b; }

    public void set_string(string b)
    {m_value = b;}

    public bool get_bool()
    {
        if (m_value == null || m_value.GetType() != typeof(bool))
        {return false;}
        return (bool)m_value;
    }

    public double get_value()
    {
        if (m_value == null || m_value.GetType() != typeof(double))
        {return 0;}
        return (double)m_value;
    }

    public int get_int()
    {
        if (m_value == null || m_value.GetType() != typeof(int))
        { return 0; }
        return (int)m_value;
    }

    public string get_string()
    {
        if (m_value == null)
        {return "";}
        return m_value.ToString();
    }

    public void set_object(object a)
    {m_value = a;}

    public void set_json(string data)
    {
        LitJson.JsonData js = LitJson.JsonMapper.ToObject(data);
        try
        {
            _json_add(js, this);
        }
        catch (System.Exception ex)
        {
            Logging.LogError(ex.ToString());
            m_value = null;
        }

    }

    public string to_json()
    {
        LitJson.JsonData js = _json_get(this);
        if (js == null){return "{}";}
        return js.ToJson();
    }

    static void _json_add(LitJson.JsonData js, Variant v)
    {
        if (js.IsObject){_json_add_obj(js, v);}
        else if (js.IsArray){_json_add_list(js, v);}
        else if (js.IsBoolean){_json_add_bool(js, v);}
        else if (js.IsInt){_json_add_int(js, v);}
        else if (js.IsDouble){_json_add_double(js, v);}
        else{_json_add_string(js, v);}
    }

    static void _json_add_obj(LitJson.JsonData js, Variant v)
    {
        Dictionary<string,  Variant> map = v.to_name_map();
        if (map == null)
        {return;}

        foreach (string vk in ((IDictionary)js).Keys)
        {
            LitJson.JsonData js_s = js[vk];
            map[vk] = new Variant();
            _json_add(js_s, map[vk]);
        }
    }

    static void _json_add_list(LitJson.JsonData js, Variant v)
    {
        var list = v.to_list();

        for(int i=0; i < js.Count; i++)
        {
            var sub = new Variant();
            list.Add(sub);
            _json_add(js[i], sub);
        }
    }

    static void _json_add_bool(LitJson.JsonData js, Variant v)
    {
        v.set_bool((bool)js);
    }

    static void _json_add_int(LitJson.JsonData js, Variant v)
    {
        v.m_value = ((int)js);
    }

    static void _json_add_double(LitJson.JsonData js, Variant v)
    {
        v.m_value = ((double)js);
    }

    static void _json_add_string(LitJson.JsonData js, Variant v)
    {
        v.m_value = js.ToString();
    }

    static LitJson.JsonData _json_get(Variant v)
    {
        if (v.m_value == null)
        {
            return null;
        }

        if (v.m_value.GetType() == typeof(Dictionary<string, Variant>))
        {
            LitJson.JsonData js = new LitJson.JsonData();
            foreach(var kv in ((Dictionary<string, Variant>)v.m_value))
            {
                js.SetJsonType(LitJson.JsonType.Object);
                ((IDictionary)js)[kv.Key] = _json_get(kv.Value);
            }
            return js;
        }
        else if (v.m_value.GetType() == typeof(List<Variant>))
        {
            LitJson.JsonData js = new LitJson.JsonData();
            js.SetJsonType(LitJson.JsonType.Array);
            foreach (var kv in ((List<Variant>)v.m_value))
            {
                js.Add(_json_get(kv));
            }
            return js;
        }
        else if (    
            v.m_value.GetType() == typeof(int)        ||
            v.m_value.GetType() == typeof(double)    ||
            v.m_value.GetType() == typeof(bool))
        {
            return new LitJson.JsonData(v.m_value);
        }
        else
        {
            return new LitJson.JsonData(v.m_value.ToString());
        }
    }

    public object get_object(string type)
    {
        Type t = Type.GetType(type);
        if (t == null){return null;}
        if (m_value == null){return null;}
        if (m_value.GetType() != t){return null;}
        return m_value;
    }

    public string to_string()
    {
        if (m_value == null){return "";}
        return m_value.ToString();
    }

    public double to_double(double def)
    {
        string sv = to_string();
        double ret = def;
        if (double.TryParse(sv, out ret))
        {return ret;}
        return def;
    }

    public float to_float(float def)
    {
        return (float)to_double((double)def);
    }

    public int to_int(int def)
    {
        return (int)to_double((double)def);
    }

    public object[] list_to_params()
    {
        if (m_value == null || m_value.GetType() != typeof(List<Variant>))
        {return new object[0];}
        var l = to_list();
        if (l == null || l.Count == 0)
        {return new object[0];}
        object[] pl = new object[l.Count];
        for (int i = 0; i < l.Count; i++)
        {pl[i] = l[i].m_value;}
        return pl;
    }

    public List<Variant> to_list()
    {
        if(m_value != null && m_value.GetType() == typeof(List<Variant>))
        {return (List<Variant>)m_value;}
        List<Variant> l  = new List<Variant>();
        m_value = l;
        return l;
    }

    public Dictionary<int,  Variant> to_map()
    {
        if(m_value != null && m_value.GetType() == typeof(Dictionary<int,Variant>))
        {return (Dictionary<int,  Variant>)m_value;}
        Dictionary<int,  Variant> l  = new Dictionary<int,  Variant>();
        m_value = l;
        return l;
    }

    public Dictionary<string, Variant> to_name_map()
    {
        if (m_value != null && m_value.GetType() == typeof(Dictionary<string, Variant>))
        {return (Dictionary<string,  Variant>)m_value;}
        Dictionary<string,  Variant> l  = new Dictionary<string,  Variant>();
        m_value = l;
        return l;
    }

    public Variant push_in_list()
    {
        var n = new Variant();
        to_list().Add(n);
        return n;
    }

    public Variant get_in_list(int id)
    {
        List<Variant> v = to_list();
        if (v == null)
        {
            return null;
        }

        if (id < 0 || id >= v.Count)
        {
            return null;
        }

        return v[id];
    }

    public Variant apply_in_map(int id)
    {
        var v = to_map();
        if (!v.ContainsKey(id))
        {v[id] = new Variant();}
        return v[id];
    }

    public Variant apply_in_name_map(string n)
    {
        var v = to_name_map();
        if (!v.ContainsKey(n))
        { v[n] = new Variant(); }
        return v[n];
    }

    public override string ToString()
    {
        if (m_value == null)
        { return "Variant:null"; }
        return "Variant:" + m_value.GetType().Name + ":" + m_value.ToString();
    }

    object    m_value = null;
}
//第二个类文件 cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;



namespace vs2015demo
{
    public class  Person
    {

        public string Name { set; get; }
        public int Age { set; get; }
        public string Birthday { set; get; }

    }

    class Program
    {

        static void Main(string[] args)
        {
            Variant my = new Variant();
            string json = @"
            {
               ""Name""    : ""YANGJIE"",//测试了下单引号和双引号都可以
                'Age'      : 24,
                'Birthday' : '1990'
            }";

            string json2 = @"
            {
               ""Name""    : ""WUGANG"",
                'Age'      : 25,
                'Birthday' : '1990'
            }";


            //Person per = LitJson.JsonMapper.ToObject<Person>(json);
            //LitJson.JsonData js = LitJson.JsonMapper.ToObject(json);

            //Console.WriteLine(js["Name"].ToString() + js["Age"].ToString() + 
            //    js["Birthday"].ToString());

            string[] arrstr = { "yangjie", "wugang" };
            string[] jsonstr = { json, json2 };

            for (int i = 0; i < arrstr.Length; i++)
            {
                my.apply_in_name_map(arrstr[i]).set_json(jsonstr[i]);
            }

            //my.apply_in_map("yangjie").set_json(json);
            //my.apply_in_map("wugang").set_json(json2);


            for (int i = 0; i < arrstr.Length; i++)
            {
                var it = my.apply_in_name_map(arrstr[i]);
                Console.WriteLine(it.to_name_map()["Name"].get_string());
                Console.WriteLine(it.to_name_map()["Age"].get_int());
                Console.WriteLine(it.to_name_map()["Birthday"].get_string());
            }







           // my.apply_in_name_map("yangjie").set_int(25);
          //  var age = my.apply_in_name_map("yangjie").get_int();


            //my.push_in_list();
            //my.push_in_list();
            //my.get_in_list(0).set_int(100);
            //my.get_in_list(1).set_int(101);
            //for (int i = 0; i < 2; i++)
            //{
            //    Console.WriteLine(my.get_in_list(i).get_int());
            //}


            // Console.WriteLine(age);
            Console.ReadKey(); 

        }
    }
}


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值