[转]按照HashTable动态设定类的属性和字段
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;
}
}
}
}
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;
}
}
}
}
原文 http://www.cnblogs.com/lovecherry/archive/2005/04/27/146461.html