如何动态设定类的属性和字段?

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 @ 2006-12-29 13:47  Kevin Lin  阅读(348)  评论(0编辑  收藏  举报