如何利用反射动态设定类的属性和字段

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;
            }
        }
    }

}

posted on 2006-12-18 17:51  Leetle  阅读(615)  评论(0编辑  收藏  举报

导航