C#中遍历对象实例的 属性/值 对

写 Ajax 程序的时候,经常要和后台服务器进行时实的数据交互,以前用的是自定义的字符串格式,比如用“,”进行间隔(有时也用很长的没有用的字符串进行区分),然后再在 javascript 代码中对其进行分隔后得到字符数组对应索引的值,常常是调试很多遍才能对号入座,后来想到了 JSON 这种可以在 javascrip 中很方便就调用的数据格式,所以萌生了想把后台数据生成 JSON格式的想法。之后,在网上找了半天,说 framework3.5 已经可以把对象的属性/值对转换成 JSON 数据格式,我看了一下,又是安装 framework 又是导包,到时候服务器还不一定能够支持,所以这个方法就放弃了(放弃这个方法的主要原因是,我在服务器的IIS部署 Web网站时候,需要 framework 各个不同的版本,有的服务器能够一下子搞定,有的怎么都搞不定,所以不想在各个 framework 版本之间挣扎)。

    这个 ToJSONString() 只是用到了对象实例的 GetType() 和 System.Type 的 GetProperties() 方法

GetProperties() 方法返回 ProtertyInfo 数组,保存的是对象相关的属性和值,(当然还有更多的信息,但对于此处,不是必须的)。

    关键代码在 ToJSONString() 方法,希望对有需要的人些许帮助。

/*
 * 定义一个测试类
 * 所有属性均为私有,但提供公共访问方法 get 和 set
 */
public class UserInfo
{
    public UserInfo()
    {
    }
    public UserInfo(string name, int age, string address, string sex)
    {
        this.Name = name;
        this.Age = age;
        this.Address = address;
        this.Sex = sex;
    }
    public string like;
    private string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
    private int _age;

    public int Age
    {
        get { return _age; }
        set { _age = value; }
    }
    private string _address;

    public string Address
    {
        get { return _address; }
        set { _address = value; }
    }
    private string _sex;

    public string Sex
    {
        get { return _sex; }
        set
        {
            if (value != "女" && value != "男")
            {
                throw new Exception("性别错误,请在 男/女 中选择一个!");
            }
            _sex = value;
        }
    }
    /*
     * 经测试,公共方法不会在 PropertiesInfo 中
     */
    public string getInfo()
    {
        return "测试公有方法";
    }
    /*
     * 转换成 JSON 字符串之后可以方便在 javascript 访问对象的属性
     * 如 UserInfo 有属性 Name
     * 在 javascript 中可以用 var obj = eval('(jsonString)'); obj.Name 得到其值
     */
    public string ToJSONString()
    {
        System.Reflection.PropertyInfo[] ps = this.GetType().GetProperties();
        string json = "{";
        int index = 1;
        foreach (System.Reflection.PropertyInfo pi in ps)
        {
            //Name 为属性名称,GetValue 得到属性值(参数this 为对象本身,null)
            string name = pi.Name;
            string value = Convert.ToString(pi.GetValue(this, null));
            //把 javascript 中的特殊字符转成转义字符
            value = value.Replace("//", "").Replace("'", "//'").Replace("/"", "///"");
            json += name + ":'" + value + "'";
            if (index != ps.Length)
            {
                json += ",";
            }
            index++;
        }
        json += "}";
        return json;
    }
    /*
     * 经过以上测试,得到结论,只有当属性使用 get 和 set 进行封装了之后,才在 PropertiesInfo 中出现
     * 即,经过 get/set 封装之后的私有属性可以放心的使用 PropertiesInfo 进行遍历。
     */
}

 

//使用 WebPage 进行输出测试

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        UserInfo u = new UserInfo();
        u.Age = 25;
        u.Name = "吴家龙";
        u.Sex = "男";
        u.Address = "广州市萝岗经'济开发/"区宝//石路11号301";
        u.like = "不知道";//经测试,如果一个属性定义为公有字段,则在 PropertiesInfo 中没有
        UserInfo u1 = new UserInfo("王", 24, "广州市", "女");  
        Response.Write(u.ToJSONString()+"<br/>");
        Response.Write(u1.ToJSONString());
        btnOK.Text = u.ToJSONString();
    }
}

//页面代码

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
    <script type="text/javascript" src="jquery-1.3.2.js"></script><%--这里使用了 jquery--%>
    <script type="text/javascript">

        $(function(){
             $("#btnOK").bind("click",function(){
                var s = $(this).val();               
                var o = eval('('+ s +')');         
                alert(o.Name + " " + o.Address);
                alert(o.Address);
            });

         });


    </script>
</head>
<body>
    <form id="form1" runat="server" οnsubmit="return false;">
        asp:Button ID="btnOK" UseSubmitBehavior="false" runat="server"  />
    </form>
</body>
</html>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值