| 

.NET C# Java Javascript Exception

2
Meine Funktion :
Public Function GetContent(ByVal Instance As Object) As String()
Dim fields As Reflection.FieldInfo() = Instance.GetType.GetFields(Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance)
Dim values(fields.Length - 1) As String

For i As Integer = 0 To fields.Length - 1
values(i) = fields(i).GetValue(Instance).ToString
Next
Return values
End Function


Der Parameter Instance enthält enthält leider noch eine Struktur die aber nicht richtig aufgelöst wird. Hat dazu vieleicht jemand eine Idee
26.06.2013
jstiefken 41 1 3
Floyd 14,6k 3 9
Jetzt kannst Du noch einen Beitrag als Antwort markieren. Danke :-)
– Gast 26.06.2013
4 Antworten
1
// Pseudocode
Dim value = fields(i).GetValue(Instance)
if(value.IsValueType)
{
Dim fields2 = value.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public)
}
26.06.2013
lbm1305 849 1 8
lbm1305 849 1 8
Kann immernoch nicht +1 Voten :(
Floyd 26.06.2013
Technisch bedingt oder zu wenig Code? :-)
lbm1305 26.06.2013
Technisch bedingt
Floyd 26.06.2013
Floyd: Ok, dann hab ich es für Dich getan ;-)
judgy 27.06.2013
1
Neuer Anlauf (ist in C# geschrieben, wenn du Probleme beim Umsetzten in VB.Net hast, sag bescheit):

public static List<string> GetContent(object Instance){
System.Reflection.FieldInfo[] fields = Instance.GetType().GetFields(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);

List<string> result = new List<string>();

for(int i=0; i<fields.Length;i++){
object val = fields.GetValue(Instance);
if(val == null) continue;

Type typ = val.GetType();
if(typ.IsValueType && !typ.IsPrimitive && !typ.IsEnum)
result.AddRange(GetContent(val));
else
result.Add(fields.GetValue(Instance).ToString());
}

return result;
}[/code]
26.06.2013
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Ja da bau ich auch grade rum das scheint die Lösung zu sein Danke an alle
jstiefken 26.06.2013
Was verbirgt sich eigentlich hinter GetContent(Val) ?
jstiefken 26.06.2013
Rekursion ;-) Hier ruft die die Methode selber auf.
lbm1305 26.06.2013
Ein rekursiver Aufruf der selben Methode. Dh. die Methode ruft sich selbst auf.
Floyd 26.06.2013
Wenn "result.AddRange(GetContent(val));" durchlaufen wird, gibt der rekursive Aufruf eine leere Collection zurück. Problem besteht dann, wenn Instance ein Integer-Field deklariert bzw. initialisiert hat.
lbm1305 26.06.2013
Bug behoben, siehe Code... man muss "Primitive" Datentypen ausschließen
Floyd 26.06.2013
"Primitive" Datentypen sind z.B. int's
Floyd 26.06.2013
Stimmt, so gehts auch :-)
lbm1305 26.06.2013
1
Hier nochmal die VB.NET Variante:

Public Structure Bar
Public Name As String

End Structure


Public Class Foo

Public Id As Integer

Public Bar As Bar

Public Sub New()

Id = 1

Bar = New Bar()
Bar.Name = "Max Mustermann"

End Sub

End Class


Sub Main()

Dim foo = New Foo()

Dim result = GetContent(foo)
' 1, Max Mustermann '

End Sub


Private Function GetContent(ByVal instance As Object) As IEnumerable(Of String)

Dim bindingFlags As BindingFlags = Reflection.BindingFlags.Instance Or Reflection.BindingFlags.Public

Dim result As List(Of String) = New List(Of String)()

Dim fields As FieldInfo() = instance.GetType().GetFields(bindingFlags)

For i As Integer = 0 To fields.Length - 1

Dim value As Object = fields(i).GetValue(instance)

If (value Is Nothing) Then
Continue For

End If

Dim typeOfValue = value.GetType()

If (typeOfValue.IsValueType AndAlso Not _
typeOfValue.IsPrimitive AndAlso Not _
typeOfValue.IsEnum) Then

result.AddRange(GetContent(value))

Else
result.Add(value.ToString())

End If
Next
Return result

End Function
26.06.2013
lbm1305 849 1 8
lbm1305 849 1 8
Ok Klappt gut und jetzt hab ich endlich auch mal die Rekursion kapiert Danke
jstiefken 26.06.2013
Jetzt kannst Du noch einen Beitrag als Antwort markieren. :-)
lbm1305 26.06.2013
0
Der Value eines Feldes deiner Struktur kann Nothing sein:

Public Function GetContent(ByVal Instance As Object) As String()
Dim fields As Reflection.FieldInfo() = Instance.GetType.GetFields(Reflection.BindingFlags.Public Or Reflection.BindingFlags.Instance)
Dim values(fields.Length - 1) As String

For i As Integer = 0 To fields.Length - 1
if fields(i).GetValue(Instance) IsNot Nothing then
values(i) = fields(i).GetValue(Instance).ToString
end if
Next
Return values
End Function
26.06.2013
Floyd 14,6k 3 9
Floyd 14,6k 3 9
Hallo floyd Danke schonmal
mein problem ist leider nicht das Nothing sondern das In der Struktur Instance noch weirere Strukturen dirnstecken. Diese werden mir nicht aufgelöst, sondern ich bekomme den Namen der Struktur zurück und nicht die Felder.....
jstiefken 26.06.2013

Stelle deine .net-Frage jetzt!