| 

.NET C# Java Javascript Exception

7
Irgendwie geht das wohl mit Reflection, aber ich finde das passende nicht. Das gibt es dann sicher auch für Methoden?
15.02.2011
Zorro 161 1 7
4 Antworten
9
Ein Beispiel, mit dem Infos zur Klasse System.Console über Reflection ermittelt werden

using System.Reflection // wird benötigt
...

Type sType = Type.GetType("System.Console");

MemberInfo[] memberArray = sType.GetMembers();
foreach (MemberInfo mi in memberArray)
{
Console.WriteLine("{0} -> {1}", mi, mi.MemberType);
}
15.02.2011
Joachim 3,1k 4 9
Joachim 3,1k 4 9
3
Hi,

schau Dir
GetFields

und
GetMember

an.
Dass müsste reichen.
15.02.2011
KHoffmann 939 7
3
Für solche Zwecke habe ich mir eine statische ToString Methode gebastelt, in die ich das Objekt reingebe, um die Felder und deren Belegungen als String zurück zu erhalten (bspw. fürs Logging):


using System.Reflection;

...

public static string ToString(object o)
{
StringBuilder sb = new StringBuilder();
System.Type t = o.GetType();
PropertyInfo[] pis = t.GetProperties();
for (int i = 0; i < pis.Length; i++)
{
try
{
PropertyInfo pi = (PropertyInfo)pis.GetValue(i);
sb.AppendFormat("{0}: {1}" + Environment.NewLine, pi.Name, pi.GetValue(o, new object[] { }));
}
catch (Exception) { }
}
return sb.ToString();
}


Grüße
CRegenschein
15.02.2011
CRegenschein 645 2 9
Wobei ich die Methode lieber "DUMP" oder so nennen würde.
Floyd 15.02.2011
Ja, gute Idee. Könnte man sich ja auch als Extension Methode basteln. Gruß ~~
CRegenschein 15.02.2011
So besser? (siehe unten) ;-)
CRegenschein 16.02.2011
1
Hier nochmal als Extension Methode (einfach in den Namespace reinlegen und mitkompilieren. Dann kann man auf jedem Objekt die Methode DumpMe() aufrufen und kriegt einen String zurück - jetzt sogar mit Array Auflistung :-))
public static class ExtensionDumpMe
{
public static string DumpMe(this object o)
{
{
StringBuilder sb = new StringBuilder();

#region Override ToString() default with reflection
System.Type t = o.GetType();
PropertyInfo[] pis = t.GetProperties();
for (int i = 0; i < pis.Length; i++)
{
try
{
PropertyInfo pi = (PropertyInfo)pis.GetValue(i);
if (pi.GetGetMethod().ReturnType.IsArray)
{
var getMethod = pi.GetGetMethod();
var arrayObject = getMethod.Invoke(o, null);
int j = 0;

foreach (object element in (Array)arrayObject)
{
foreach (PropertyInfo arrayObjPinfo in element.GetType().GetProperties())
{
sb.AppendFormat("ENUM {0}[{2}]: {1}" + Environment.NewLine, pi.Name, arrayObjPinfo.GetGetMethod().Invoke(element, null).ToString(), j);
j++;
}
}
}
else
{
sb.AppendFormat("{0}: {1}" + Environment.NewLine, pi.Name, pi.GetValue(o, new object[] { }));
}
}
catch (Exception) { }
}
#endregion Override ToString() default with reflection

return sb.ToString();

}
} // method
} // extension class
16.02.2011
CRegenschein 645 2 9
+1, gefällt mir persönlich besser :D
Floyd 14.03.2011

Stelle deine Klasse-Frage jetzt!