有如下的类,要求根据字段名(字符串形式)动态获得该字段的实例引用,大家看看问号的部分该怎么写
public class test
{
public byte a=33;
public Double b=22;
public int c;
public Dictionary<int, object> l = new Dictionary<int, object>();
public void addtolist(int ID,string FieldName)
{ l.Add(ID,??? ); } }
test t = new test();//创建实例
t.addtolist(1,"b");//集合中加如字段b
public class test
{
public byte a=33;
public Double b=22;
public int c;
public Dictionary<int, object> l = new Dictionary<int, object>();
public void addtolist(int ID,string FieldName)
{ l.Add(ID,??? ); } }
test t = new test();//创建实例
t.addtolist(1,"b");//集合中加如字段b
t.addtolist(1,t.b);public void addtolist(int ID,string FieldName)
这个改为:
public void addtolist(int ID,object Field)
{
l.Add(ID, Field);
}抛开这个问题不谈,我感觉你的路子走的有点偏。
你想用这个办法解决的问题,一定有更好的解决办法。
但是,反射不能直接操作成员变量,只能调用成员函数。(对成员变量的访问可以通过编写对应的成员函数做到)
你的l,类型可以改为Dictionary<int, string>,直接保存成员函数的名字
到要引用成员函数的时候,比如这个成员的名字暂时保存在string member;中,就这样:
foreach(MethodInfo mi in t.GetType().GetMethods())
{
if( mi.Name == member )
{
mi.Invoke(t, null);
break;
}
}
1,"b" 2,"a" 3,"c"根据这张表来添加对象,大家看怎么办
{
//l.Add(ID,??? );
System.Reflection.FieldInfo field = this.GetType().GetField(FieldName); //add some verification here.
// then
l.Add(ID, field.GetValue(this);
} 这里用的是Reflection(反射)机制