none
Jak procházet pomocí MemberInfo strukturou objektů?

    Dotaz

  • Mám obecnou strukturu viz příklad:

    public class point
    {
        int x;
        int y;
    }
    public class test1
    {
        int a;
        int aa;
        point po;
    }

    test1 test;

    Instanci "test" (a nebo instanci jiné třídy) dostanu ji do parametru funkce jako typ object "o" a potřebuji se dostat na "test.po.x"
    Na "a" a "aa" se dostanu lehko
    Type t = o.GetType();

    System.Reflection.FieldInfo[] fi = t.GetFields();
    foreach (FieldInfo f in fi)//FieldInfo
    {
             f.Name;

             f.ToString();

             f.GetValue(o);
    }

    ale jak na "po"?
    Potřebuji vlastně přejít z objektu na jeho člena. Poradíte někdo jak? Diky!

    čtvrtek 25. března 2010 11:59

Odpovědi

  • using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class point
            {
                int x;
                int y;
            }
    
            public class test1
            {
                int a;
                int aa;
                point po;
            }
    
            static void Main(string[] args)
            {
                BindingFlags bFlags = BindingFlags.Public |
                    BindingFlags.Instance |
                    BindingFlags.NonPublic |
                    BindingFlags.Static |
                    BindingFlags.DeclaredOnly;
                FieldInfo[] fields = typeof(test1).GetFields(bFlags);
                //
                foreach (FieldInfo item in fields)
                {
                    Console.Write(item.FieldType.Name + " " + item.Name);
                    Console.WriteLine();
    
                    if (item.FieldType.BaseType != typeof(ValueType))
                    {
                        foreach (FieldInfo subItem in item.FieldType.GetFields(bFlags))
                        {
                            Console.WriteLine(" >> " + subItem.FieldType.Name + " " + subItem.Name);
                        }
                    }
    
                    Console.WriteLine("___________");
                }
                //
            }
        }
    }
    
    Este je tam jeden bug, pretoze ak by napr. trieda point obsahovala opet nejaky referencny typ, tak by nevypisalo jeho cleny.
    pátek 26. března 2010 21:46
  • //Takto zistis metody triedy (s pouzitim predchadz. bFlags)
    MethodInfo[] methods = typeof(test1).GetMethods(bFlags);
    
    //Info o metodach prejdes nasledovne
    foreach (MethodInfo item in methods)
    {
      Console.WriteLine(item.ReturnType.Name + " " + item.Name);
    }
    
    čtvrtek 22. července 2010 9:44

Všechny reakce

  • using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Reflection;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            public class point
            {
                int x;
                int y;
            }
    
            public class test1
            {
                int a;
                int aa;
                point po;
            }
    
            static void Main(string[] args)
            {
                BindingFlags bFlags = BindingFlags.Public |
                    BindingFlags.Instance |
                    BindingFlags.NonPublic |
                    BindingFlags.Static |
                    BindingFlags.DeclaredOnly;
                FieldInfo[] fields = typeof(test1).GetFields(bFlags);
                //
                foreach (FieldInfo item in fields)
                {
                    Console.Write(item.FieldType.Name + " " + item.Name);
                    Console.WriteLine();
    
                    if (item.FieldType.BaseType != typeof(ValueType))
                    {
                        foreach (FieldInfo subItem in item.FieldType.GetFields(bFlags))
                        {
                            Console.WriteLine(" >> " + subItem.FieldType.Name + " " + subItem.Name);
                        }
                    }
    
                    Console.WriteLine("___________");
                }
                //
            }
        }
    }
    
    Este je tam jeden bug, pretoze ak by napr. trieda point obsahovala opet nejaky referencny typ, tak by nevypisalo jeho cleny.
    pátek 26. března 2010 21:46
  • Dík!

    Musel jsem dělat něco jiného a tak jsem se k pořádnému vyzkoušení dostal až teď. Funguje to mnohem líp než to moje, dík. Pěkně vrací vnořené třídy i členy, jen tam nejsou žádné funkce, které chci taky a BindingFlags.InvokeMethod nepomáhá. Co mám ještě udělat?

    středa 21. července 2010 12:24
  • //Takto zistis metody triedy (s pouzitim predchadz. bFlags)
    MethodInfo[] methods = typeof(test1).GetMethods(bFlags);
    
    //Info o metodach prejdes nasledovne
    foreach (MethodInfo item in methods)
    {
      Console.WriteLine(item.ReturnType.Name + " " + item.Name);
    }
    
    čtvrtek 22. července 2010 9:44