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

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

using System;

namespace Test
{
/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  Class1 的摘要说明。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </summary>

class Class1
{
/**/ ///

1<summary>   
2![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif) ///  应用程序的主入口点。   
3![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif) ///  </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;
}
}
}

}

Published At
Categories with Web编程
Tagged with
comments powered by Disqus