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);

解决方案 »

  1.   

    myval 是静态的啊C.myval  就可以了哈
      

  2.   

    只能实现
    string sField ="mya";
    Type type = this.GetType();
    System.Reflection.FieldInfo myFieldInfo=type.GetField(sField);
    ------------------------------------------------------------------象是递归遍历叶子节点,找名字符合的属性试试在A和B中加入同名属性,看看会找到哪个!
      

  3.   

    using System;
    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);
    }
    }
    }
      

  4.   

    to:xujiaoxiang(翱翔)
    层次遍历好做,希望能找到直接访问的方法....
      

  5.   

    可以自己写个方法实现。
    首先split字符串"mya.myb.myc.myval"
    然后层次遍历调用实现。只能想到这个方法了。期待高手ing
      

  6.   

    你的代码中给出的是静态的,同意
    tiaoci(我挑刺,我快乐) 的说法……
    这是最简单的了……
    为什么要用反射呢……
      

  7.   

    to librastar2001 (天平) "
    http://community.csdn.net/Expert/topic/4620/4620774.xml?temp=1.498049E-02老大,不能这么不负责任吧
    "并非不负责任啊,你的字段就是 static 的么我看不出你想问什么啊 :)
      

  8.   

    如果是普通字段,那么也只有像 xujiaoxiang(翱翔) 说的那样“
    可以自己写个方法实现。
    首先split字符串"mya.myb.myc.myval"
    然后层次遍历调用实现。”
      

  9.   

    基本上就像下面这个样子了public class Template
    {
    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);
    }
    }
      

  10.   

    楼主对Static的概念都没搞清楚这个问题不是问题Static字段和Public字段不一样