(论坛答疑点滴)如何动态设定类的属性和字段?

动态

正好有人问这个,代码非常简单,最基本的应用,直接贴代码

using System;

namespace Test
{
    /**//// <summary>
    /// Class1 的摘要说明。
    /// </summary>
    class Class1
    {
        /**//// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main(string[] args)
        {
            //
            // TODO: 在此处添加代码以启动应用程序
            //
            MyFieldClass dv=new MyFieldClass();
            System.Collections.Hashtable ht1=new System.Collections.Hashtable();
            ht1.Add("FieldA","A");
            ht1.Add("FieldC","C");
            SetField1(ht1,dv);//如果类中的字段匹配Hashtable中的Key则重新设定
            //SetField2(ht1,dv)//如果Hashtable中的Key匹配类中的字段则重新设定,效果等同于SetField1
            Console.WriteLine(dv.FieldA);//A
            Console.WriteLine(dv.FieldB);//bb
            Console.WriteLine(dv.FieldC);//C
            System.Collections.Hashtable ht2=new System.Collections.Hashtable();
            ht2.Add("PropertyB","b");
            ht2.Add("PropertyC","c");
            SetProperty1(ht2,dv);//如果类中的属性匹配Hashtable中的Key则重新设定
            //SetProperty2(ht2,dv);//如果Hashtable中的Key匹配类中的属性则重新设定,效果等同于SetProperty1
            Console.WriteLine(dv.FieldA);//A
            Console.WriteLine(dv.FieldB);//b
            Console.WriteLine(dv.FieldC);//c
            
        }

        public static void SetProperty1(System.Collections.Hashtable ht1,MyFieldClass dv)
        {
            foreach(System.Collections.DictionaryEntry de in ht1)
            {
                System.Reflection.PropertyInfo pi=dv.GetType().GetProperty(de.Key.ToString());
                if(pi!=null)pi.SetValue(dv,de.Value.ToString(),null);
            }
        }

        public static void SetProperty2(System.Collections.Hashtable ht1,MyFieldClass dv)
        {
            foreach(System.Reflection.PropertyInfo pi in dv.GetType().GetProperties())
            {
                if(ht1.Contains(pi.Name))pi.SetValue(dv,ht1[pi.Name],null);
            }
        }

        public static void SetField1(System.Collections.Hashtable ht2,MyFieldClass dv)
        {
            foreach(System.Collections.DictionaryEntry de in ht2)
            {
                System.Reflection.FieldInfo fi=dv.GetType().GetField(de.Key.ToString());
                if(fi!=null)fi.SetValue(dv,de.Value.ToString());
            }
        }

        public static void SetField2(System.Collections.Hashtable ht2,MyFieldClass dv)
        {
            foreach(System.Reflection.FieldInfo fi in dv.GetType().GetFields())
            {
                if(ht2.Contains(fi.Name))fi.SetValue(dv,ht2[fi.Name]);
            }
        }
    }

    public class MyFieldClass
    {
        public string FieldA="aa";
        public string FieldB="bb";
        public string FieldC="cc";

        public string PropertyA
        {
            get
            {
                return FieldA;
            }
            set
            {
                FieldA=value;
            }
        }

        public string PropertyB
        {
            get
            {
                return FieldB;
            }
            set
            {
                FieldB=value;
            }
        }

        public string PropertyC
        {
            get
            {
                return FieldC;
            }
            set
            {
                FieldC=value;
            }
        }
    }

}

时间: 2024-10-29 19:23:36

(论坛答疑点滴)如何动态设定类的属性和字段?的相关文章

Python实现动态添加类的属性或成员函数的解决方法_python

某些时候我们需要让类动态的添加属性或方法,比如我们在做插件时就可以采用这种方法.用一个配置文件指定需要加载的模块,可以根据业务扩展任意加入需要的模块. 本文就此简述了Python实现动态添加类的属性或成员函数的解决方法,具体方法如下: 首先我们可以参考ulipad的实现:mixin. 这里做的比较简单,只是声明一个类,类初始化的时候读取配置文件,根据配置列表加载特定目录下的模块下的函数,函数和模块同名,将此函数动态加载为类的成员函数. 代码如下所示: class WinBAS(Bas): def

修改自定义类中属性的可见性问题(动态增减类的属性个数)

问题描述 之前发了一个帖子问题描述的太简单了给大家造成了误解这里重新开贴详细说明出于项目要求需要定义一个属性可以动态增加的类(比如说定义一个截面类,包含形状.半径.长度.宽度四个属性,其中形状枚举圆形和矩形两种,选择圆形时显示半径属性不显示长宽属性,选择矩形时显示长宽属性不显示半径属性.也就是说利用PropertyGrid控件展示该类的属性是,当选择圆形时PropertyGrid可以显示2个属性,选择矩形时PropertyGrid则显示3个属性,无论2个属性还是3个属性对应的是同一个实例)于是在

(论坛答疑点滴)用户控件动态加载PostBack后的问题

动态|加载|控件|问题 很多网友在按钮的click事件中动态添加用户控件在页面回传后消失了或者就是用户控件中的按钮事件不能触发,下面是解决办法:(1)首先添加一个用户控件:WebUserControl1.ascx添加一个按钮:public System.Web.UI.WebControls.Button ucb;Text为"用户控件的按钮"(等会要在Page中用到这个按钮,所以设置为public)<asp:Button id="ucb" Text="

(论坛答疑点滴)怎么给Table动态添加控件并且得到控件的值?

动态|控件 此例子达到的效果是: 每按一次Button1,在表格Table1中添加一行(行中有2列,一列是文本框,一列是下拉框),并且当按钮第一次按下时再添加一个按钮,点击这个动态添加的按钮,输出表格中所有的控件的值. 前台: <form id="Form1" method="post" runat="server">             <asp:Table id="Table1" runat=&quo

(论坛答疑点滴)如何在一个用户控件内操作另外一个用户控件的中的控件?

控件 比如一个论坛,上面一个top用户控件用来登陆,下面一个buttom的用户控件用来显示在线人数,要求登陆以后立即刷新online中的在线人数,就需要在一个用户控件中操作另外一个用户控件中的控件(这2个用户控件都包含在一个页面中) 看过 http://www.cnblogs.com/lovecherry/archive/2005/03/25/125515.html 和 http://www.cnblogs.com/lovecherry/archive/2005/04/11/135543.htm

(论坛答疑点滴)联合主键的情况怎么在DataGrid中利用DataKeys定位记录?

datagrid   比如表中三个字段 key1 int,key2 int,item varchar(50) 前面2个字段联合主键 前台代码: <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" DataKeyField="DoubleKey">                 <Columns>        

(论坛答疑点滴)如果用DataGrid实现类似DataList多列的效果

datagrid  上一次说了怎么利用DataGrid纵向显示 http://www.cnblogs.com/lovecherry/archive/2005/04/23/143819.html 其实这么做的好处在于DataGrid能够方便的进行分页,这个排列次序接近于DataList的RepeatDirection="Vertical"效果 今天再来对上次的程序进行一下修改,实现RepeatDirection="Horizontal"的效果,同时启用DataGrid

(论坛答疑点滴)有的时候DataGrid取值取不到?

datagrid   有的时候想取不是编辑状态的值,这个时候通常不会使用模板列中放置TextBox通过e.Item.FindControl取值,有的网友问为什么取不到?这要看你前台的列怎么写的了,下面分别写出四种情况和这四种情况下面的取值方式: <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" AllowPaging="True"

(论坛答疑点滴)如果向某网址Post信息,并得到CookieContainer以便以后直接通过验证

cookie using System;  using System.Net;  using System.IO;  using System.Text;         [STAThread]          static void Main(string[] args)          {              //              // TODO: 在此处添加代码以启动应用程序              //              string url="http:/