Nejčastěji odpovídající uživatel
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!
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.- Označen jako odpověď KFL-MSMicrosoft employee čtvrtek 28. dubna 2011 14:08
-
//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); }
- Označen jako odpověď KFL-MSMicrosoft employee čtvrtek 28. dubna 2011 14:08
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.- Označen jako odpověď KFL-MSMicrosoft employee čtvrtek 28. dubna 2011 14:08
-
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?
-
//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); }
- Označen jako odpověď KFL-MSMicrosoft employee čtvrtek 28. dubna 2011 14:08