public class A
{
B myb = new B();
}public class B
{
C myc = new C();
}public class C
{
public static int myval = 123;
}A mya = new A();如何实现动态直接访问 mya.myb.myc.myval的功能??只能实现
string sField ="mya";
Type type = this.GetType();
System.Reflection.FieldInfo myFieldInfo=type.GetField(sField);以下代码是不能实现的
string sField ="mya.myb.myc.myval";
Type type = this.GetType();
System.Reflection.FieldInfo myFieldInfo=type.GetField(sField);
{
B myb = new B();
}public class B
{
C myc = new C();
}public class C
{
public static int myval = 123;
}A mya = new A();如何实现动态直接访问 mya.myb.myc.myval的功能??只能实现
string sField ="mya";
Type type = this.GetType();
System.Reflection.FieldInfo myFieldInfo=type.GetField(sField);以下代码是不能实现的
string sField ="mya.myb.myc.myval";
Type type = this.GetType();
System.Reflection.FieldInfo myFieldInfo=type.GetField(sField);
string sField ="mya";
Type type = this.GetType();
System.Reflection.FieldInfo myFieldInfo=type.GetField(sField);
------------------------------------------------------------------象是递归遍历叶子节点,找名字符合的属性试试在A和B中加入同名属性,看看会找到哪个!
using System.Reflection;namespace Test
{
public class A
{
B myb = new B();
} public class B
{
C myc = new C();
} public class C
{
public int myval = 123;
}
class TestMain
{
public static void Main()
{
A objA = new A();
Type typeA = objA.GetType();
FieldInfo fiA = typeA.GetField("myb",BindingFlags.NonPublic | BindingFlags.Instance);
object objB = fiA.GetValue(objA); Type typeB = fiA.FieldType;
FieldInfo fiB = typeB.GetField("myc",BindingFlags.NonPublic | BindingFlags.Instance);
object objC = fiB.GetValue(objB); Type typeC = fiB.FieldType;
FieldInfo fiC = typeC.GetField("myval",BindingFlags.Public | BindingFlags.Instance);
int myval = (int)fiC.GetValue(objC);
Console.WriteLine(myval);
}
}
}
层次遍历好做,希望能找到直接访问的方法....
首先split字符串"mya.myb.myc.myval"
然后层次遍历调用实现。只能想到这个方法了。期待高手ing
tiaoci(我挑刺,我快乐) 的说法……
这是最简单的了……
为什么要用反射呢……
http://community.csdn.net/Expert/topic/4620/4620774.xml?temp=1.498049E-02老大,不能这么不负责任吧
"并非不负责任啊,你的字段就是 static 的么我看不出你想问什么啊 :)
可以自己写个方法实现。
首先split字符串"mya.myb.myc.myval"
然后层次遍历调用实现。”
{
public class A { B myb = new B(); }
public class B { C myc = new C(); }
public class C { int myval = 123; } public static void Main(string [] args)
{
Console.WriteLine(Find(new A(), "myb.myc.myval"));
}
public static object Find(object obj, string path)
{
if(path == null) throw new ArgumentNullException("path");
foreach(string name in path.Split('.'))
{
if(obj == null) break;
obj = FindSingle(obj, name);
}
return obj;
} private static object FindSingle(object obj, string name)
{
if(obj == null) throw new ArgumentNullException("obj");
FieldInfo fi = obj.GetType().GetField(name,
BindingFlags.NonPublic | BindingFlags.Instance);
return fi.GetValue(obj);
}
}