Laden...
Avatar #avatar-3436.png
Benutzerbeschreibung

Forenbeiträge von Ismoh Ingesamt 31 Beiträge

14.08.2015 - 13:46 Uhr

Nachdem ich nun den Typ auslesen konnte, habe ich tatsächlich auch schon drüber nachgedacht, dass Reflection eventuell nicht wirklich der richtige Ansatz ist.

Eigentliche Idee war, dass ich eine Liste mit Objekten habe, die gespeichert werden sollen - aktuelle Werte der Eigenschaften und deren Typen.
Eine einfache Textdatei möchte ich nicht benutzen, da ich mich um die Struktur dieser ebenfalls kümmern müsste, also dachte ich an JSON.
Nachdem ich mir JSON etwas genauer angeschaut habe, gefiel mir es nicht mehr, da es ebenfalls Werte in eine Zeile schreibt - ist meiner Meinung nach ebenso unübersichtlich wie eine einfache Textdatei.
Da XML angesprochen wurde, habe ich mich für XML entschieden.
(De)Serialisierung ist ebenso Neuland wie Reflection.
Auf Grund der Idee dachte ich, dass man die Eigenschaften der Objekte auslesen können müsste - Reflection.
Deshalb entschied ich mich für Reflection.
Mittlerweile denke ich, dass ich mir aber nochmal die bereits implementierte (De)Serialisierung von .NET anschauen sollte.

13.08.2015 - 19:16 Uhr

Danke für die Links, aber PlayerPrefs möchte ich nicht nutzen.

3 Schichtenmodell kenne ich von JEE und RoR, aber sehe ich momentan keine Verbindung zu einem MVC-Modell.

Ich weiß auch nicht was ich hier mache.
Habe bisher noch nie mit Reflection gearbeitet.

Datentyp des Enum ist nicht bekannt, naja ist es schon nur möchte ich da nicht "EnemyType" hinschreiben, da eine andere Liste einen anderen Datentypen haben kann.

Vielleicht kenne ich noch nicht so viele Fachbegriffe wie ihr, oder benutze diese nicht, da ich mir diese nicht merke, aber völliger Anfänger bin ich nicht.

Evtl fehlt einfach die praktische Erfahrung.

Könnten wir bitte zum eigentlichen Problem zurückkehren ?

13.08.2015 - 18:15 Uhr
  1. Okay. Wenn MyEnum als Typ nicht bekannt ist, sollte ich dann auf Array casten, richtig ?
    Oder kann ich über den Typ also "System.Collections.Generic.List`1[PlanetBaseClass+EnemyType]" über beispielsweise String.Substring "rausschneiden" ? Ich versuche mal beides.

  2. Fehlermeldung:

System.InvalidCastException: Cannot cast from source type to destination type. finde ich nicht eindeutig. Die andere Exception kann ich nachvollziehen, wusste aber nicht wie man diese beseitigt.

  1. Ah verstehe, also eine Art Referenz ?

//EDIT:

foreach(Enum item in valueItems.Cast<Enum>)

funktioniert nicht, da ich .NET 2.0 nutze.

Ich hatte nun folgenden Ansatz:


ICollection valueItems = (ICollection)propertyValue;
                                        Array[] valueItemsAsString = new Array[(int)propertyValue.GetType().GetProperty("Count").GetValue(propertyValue,null)];
                                        valueItems.CopyTo(valueItemsAsString, 0);
                                        for(int i= 0; i < valueItemsAsString.Length; i++)
                                        {
                                            xmlWriter.WriteString(valueItemsAsString[i].ToString()); //den Wert der Eigenschaft schreiben
                                        }

Funktioniert auf Grund der unterschiedlichen Typen nicht.

Fehlermeldung:
Warnung 1 SavegameManager: Property "enemyTypes" could not be saved:
System.ArrayTypeMismatchException: (Types: source=PlanetBaseClass+EnemyType; target=System.Array)
at System.Array.Copy (System.Array sourceArray, Int32 sourceIndex, System.Array destinationArray, Int32 destinationIndex, Int32 length) [0x00165] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System/Array.cs:999
at System.Collections.Generic.List`1[PlanetBaseClass+EnemyType].System.Collections.ICollection.CopyTo (System.Array array, Int32 arrayIndex) [0x00000] in /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Collections.Generic/List.cs:652
at SavegameManager.Save () [0x002e9] in D:\Dropbox\shared\FatDogGames___The Lost Rescue Capsule\Unity\Assets_\Scripts\SavegameManager.cs:131 Assets/_/Scripts/SavegameManager.cs 157 1 Projektmappe "UnityVS.Unity" (2 Projekte)

Dann dachte ich:
Kann man den Typ der nested Klasse, bzw. der Eigenschaft abfragen?

13.08.2015 - 17:06 Uhr

Mein Codeschnipsel sieht nun wie folgt aus:


if (type == typeof(GameObject)) //Wenn unityObject ein GameObject ist,
            {
                GameObject thisGO = (GameObject)unityObject; //dann speichere dieses zwischen
                Component[] attachedComponents = thisGO.GetComponents<Component>(); //Rufe alle Kompenenten dieses GameObjects ab
                
                using (XmlWriter xmlWriter = XmlWriter.Create(filePath, xmlSettings))
                {
                    xmlWriter.WriteStartDocument(); //XML Dokument Zeile einfügen
                    xmlWriter.WriteStartElement(unityObject.name); //Objektnamen schreiben
                    xmlWriter.WriteAttributeString("type", type.ToString()); //Klassentyp des Objektes als Attribut hinzufügen

                    int componentIndex = 0;
                    foreach (Component attachedComponent in attachedComponents) //Jede Komponente druchlaufen
                    {
                        xmlWriter.WriteStartElement("Component" + componentIndex); //Komponente symbolisieren - Komponentenname nicht schreiben, da eine Komponente keinen Namen trägt
                        componentIndex++;
                        xmlWriter.WriteAttributeString("type", attachedComponent.GetType().ToString()); //Klassentyp der Komponente schreiben

                        PropertyInfo[] propertiesOfComponents = attachedComponent.GetType().GetProperties(); //Alle Eigenschaften des Komponententyps abrufen
                        foreach (PropertyInfo propOfComponent in propertiesOfComponents) //Alle Eigenschaften des Komponententyps durchlaufen
                        {
                            try
                            {
                                var propertyValue = propOfComponent.GetValue(attachedComponent, null); //Wert der Eigenschaft zwischenspeichern
                                if (propertyValue != null) //wenn der Wert ungleich null ist, dann
                                {

                                    if (propOfComponent.PropertyType.IsGenericType) //Wenn der gesuchte Wert mehr als einen Wert annimmt
                                    {
                                        xmlWriter.WriteStartElement(propOfComponent.Name); //Den Namen der Eigenschaft schreiben
                                        xmlWriter.WriteAttributeString("type", propertyValue.GetType().ToString()); //den Klassentypen als Attribute an das Element hängen

                                        IEnumerable valueItems = (IEnumerable)propertyValue;
                                        foreach(IEnumerable valueItem in valueItems)
                                        {
                                            xmlWriter.WriteString(valueItem.ToString()); //den Wert der Eigenschaft schreiben
                                        }

                                        xmlWriter.WriteEndElement();
                                    }
                                    else //Wenn der gesuchte Wert nur ein Wert ist, dann:
                                    {
                                        xmlWriter.WriteStartElement(propOfComponent.Name); //Den Namen der Eigenschaft schreiben
                                        xmlWriter.WriteAttributeString("type", propertyValue.GetType().ToString()); //den Klassentypen als Attribute an das Element hängen
                                        xmlWriter.WriteString(propertyValue.ToString()); //den Wert der Eigenschaft schreiben
                                        xmlWriter.WriteEndElement();
                                    }
                                }
                                else //wenn der Wert null ist, dann
                                {
                                    xmlWriter.WriteStartElement(propOfComponent.Name); //Den Namen der Eigenschaft schreiben
                                    xmlWriter.WriteAttributeString("type", "null"); //den Klassentypen als Attribute an das Element hängen
                                    xmlWriter.WriteString("null"); //den Wert der Eigenschaft schreiben
                                    xmlWriter.WriteEndElement();
                                }
                            }
                            catch (Exception e)
                            {
                                Console.Write(e);
                                Debug.LogWarning("SavegameManager: Property \"" + propOfComponent.Name + "\" could not be saved:\n" + e);
                            }
                        }
                        xmlWriter.WriteEndElement();
                    }
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndDocument();
                }
            }

Eigentlich dachte ich, dass ich es verstanden habe, jedoch wirft

foreach(IEnumerable valueItem in valueItems)

folgende Exception:

Warnung 1 SavegameManager: Property "enemyTypes" could not be saved:
System.InvalidCastException: Cannot cast from source type to destination type.
at SavegameManager.Save () [0x002d2] in D:\Dropbox\shared\FatDogGames___The Lost Rescue Capsule\Unity\Assets_\Scripts\SavegameManager.cs:130 Assets/_/Scripts/SavegameManager.cs 156 1 Projektmappe "UnityVS.Unity" (2 Projekte)

Dann dachte ich an:


ICollection valueItems2 = (ICollection)propertyValue;
for(int i = 0; i < valueItems2.Count; i++)
{
     xmlWriter.WriteString(valueItems2[i].ToString); //den Wert der Eigenschaft schreiben
}

Funktioniert auch nicht:

Fehler 36 Indizierung mit [] kann nicht auf einen Ausdruck vom Typ "System.Collections.ICollection" angewendet werden. D:\Dropbox\shared\FatDogGames___The Lost Rescue Capsule\Unity\Assets_\Scripts\SavegameManager.cs 138 67 UnityVS.Unity.CSharp

Anbei ein Screenshot.

//EDIT
Zusätzliche Frage, die mir gerade einfällt:

Ich habe die XML-Datei mal geöffnet und Folgendes gesehen:

<enemyTypes type="System.Collections.Generic.List`1[PlanetBaseClass+EnemyType]">

Wieso steht dort ein + und kein . ?
Könnte das evtl mit zu meinem Problem führen?

13.08.2015 - 14:55 Uhr

Alles nach PropertyInfo.GetValue habe ich nur hingeschrieben, um die BindingFlags zu testen - ist also Quick&Dirty und kommt auch wieder weg.

Der genaue Typ ist nicht bekannt - ich weiß nur, dass es eine Liste mit enums ist - , also sollte ich nach IEnumerable casten, bzw nach ICollection, da es eine Liste ist.

Anschließend kann ich mit Hilfe von foreach die Werte der Liste abfragen - habe ich das richtig verstanden?

13.08.2015 - 13:18 Uhr

Keys.Return steht für Enter
Keys-Enumeration

13.08.2015 - 12:02 Uhr

Ich versuche seit ein paar Tagen eine Eigenschaft einer Klasse auszulesen, die von Typ System.Collections.Generic.List<Enum> ist.
Ich versuche über PropertyInfo diese Eigenschaft zu finden - das klappt auch.
Dann möchte ich gerne die Werte des PropertyInfos auslesen - da weiß ich nicht weiter.

Der Rückgabewert von PropertyInfo.GetValue ist System.Object, richtig ?
Sobald die List abgefragt wird, bekomme ich ein Object[] zurück. Verstehe ich auch noch.

Um es für euch etwas übersichtlicher zu machen, versuche ich nur die einzelnen Zeilen, die wichtig sind, zu posten:


PropertyInfo[] propertiesOfComponents = attachedComponent.GetType().GetProperties(); //Alle Eigenschaften des Komponententyps abrufen
                        foreach (PropertyInfo propOfComponent in propertiesOfComponents) //Alle Eigenschaften des Komponententyps durchlaufen
                        {
                                var propertyValue = propOfComponent.GetValue(attachedComponent, null); //Wert der Eigenschaft zwischenspeichern
                                if (propertyValue != null) //wenn der Wert ungleich null ist, dann
                                {
                                    if (propertyValue.GetType().GetProperty("Count") != null &&
                                        propertyValue.GetType().GetProperty("Count").PropertyType == typeof(System.Int32) &&
                                        (int)propertyValue.GetType().GetProperty("Count").GetValue(propertyValue, null) > 0) //Wenn der gesuchte Wert mehr als einen Wert annimmt, dann besitzt das Objekt eine Eigenschaft mit dem Namen "Count", da ein Array zurückgegeben wird
                                    {
                                        if (propOfComponent.PropertyType.IsGenericType)
                                        {
//Hier weiß ich nicht weiter..
}
}
}

Anbei findet Ihr einen Screenshot mit den Werten - einfach nur der Übersicht halber.

Ich weiß aber nicht wie ich die Werte des Object[] auslesen kann.
Vorerst möchte ich diese Werte über einen XmlWriter in eine xml-Datei schreiben.
Zu einem späteren Zeitpunkt möchte ich diese Werte wieder benutzen - aber das werde ich mir erst später ansehen.

Wie Ihr in dem Quellcode-Ausschnitt anbei sehen könnt, habe ich schon so einige Sachen versucht, um als Beispiel die BindingFlags zu verstehen - so richtig habe ich das aber noch nicht.

Ich habe bereits im Internet recharchiert, jedoch finde ich immer nur Beispiele, bei denen der Name der Eigenschaft bekannt ist:
propertyInfo.GetProperty("wasAuchImmer")...

Da ich aber alle Objecte, die von UnityEngine.Object erben, an meine Methode übergebe, möchte ich die Namen der Properties nicht wissen.

Ich hoffe ich habe mich eingiermaßen verständlich geäußert.

Gesamter Quellcode-Ausschnitt:


if (type == typeof(GameObject)) //Wenn unityObject ein GameObject ist,
            {
                GameObject thisGO = (GameObject)unityObject; //dann speichere dieses zwischen
                Component[] attachedComponents = thisGO.GetComponents<Component>(); //Rufe alle Kompenenten dieses GameObjects ab
                
                using (XmlWriter xmlWriter = XmlWriter.Create(filePath, xmlSettings))
                {
                    xmlWriter.WriteStartDocument(); //XML Dokument Zeile einfügen
                    xmlWriter.WriteStartElement(unityObject.name); //Objektnamen schreiben
                    xmlWriter.WriteAttributeString("type", type.ToString()); //Klassentyp des Objektes als Attribut hinzufügen

                    int componentIndex = 0;
                    foreach (Component attachedComponent in attachedComponents) //Jede Komponente druchlaufen
                    {
                        xmlWriter.WriteStartElement("Component" + componentIndex); //Komponente symbolisieren - Komponentenname nicht schreiben, da eine Komponente keinen Namen trägt
                        componentIndex++;
                        xmlWriter.WriteAttributeString("type", attachedComponent.GetType().ToString()); //Klassentyp der Komponente schreiben

                        PropertyInfo[] propertiesOfComponents = attachedComponent.GetType().GetProperties(); //Alle Eigenschaften des Komponententyps abrufen
                        foreach (PropertyInfo propOfComponent in propertiesOfComponents) //Alle Eigenschaften des Komponententyps durchlaufen
                        {
                            try
                            {
                                var propertyValue = propOfComponent.GetValue(attachedComponent, null); //Wert der Eigenschaft zwischenspeichern
                                if (propertyValue != null) //wenn der Wert ungleich null ist, dann
                                {
                                    if (propertyValue.GetType().GetProperty("Count") != null &&
                                        propertyValue.GetType().GetProperty("Count").PropertyType == typeof(System.Int32) &&
                                        (int)propertyValue.GetType().GetProperty("Count").GetValue(propertyValue, null) > 0) //Wenn der gesuchte Wert mehr als einen Wert annimmt, dann besitzt das Objekt eine Eigenschaft mit dem Namen "Count", da ein Array zurückgegeben wird
                                    {
                                        if (propOfComponent.PropertyType.IsGenericType)
                                        {
                                            var enumNames = Nullable.GetUnderlyingType(propOfComponent.PropertyType).Name;
                                            var enumValues = System.Enum.GetValues(propertyValue.GetType());
                                            PropertyInfo[] propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.Instance);
                                            propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.Public);
                                            propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.DeclaredOnly);
                                            propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public);
                                            propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.Instance | BindingFlags.DeclaredOnly);
                                            propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.DeclaredOnly | BindingFlags.Public);
                                            propsGeneric = propOfComponent.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);

                                            FieldInfo[] fInfos = propOfComponent.GetType().GetFields(BindingFlags.Public | BindingFlags.Static);
                                            foreach (FieldInfo fInfo in fInfos)
                                            {
                                                Debug.Log(fInfo.Name + ": " + fInfo.GetRawConstantValue());
                                            }
                                        }


                                        //AB HIER ERNEUT PRÜFEN
                                        System.Object[] propArray = propertyValue.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);
                                        foreach(PropertyInfo propValuesOfValue in propArray)
                                        {
                                            var valueOfValue = propValuesOfValue.GetValue(propertyValue, null);
                                        }
                                            /*xmlWriter.WriteStartElement(propertyValue.GetType().GetProperty()); //Den Namen der Eigenschaft schreiben
                                            xmlWriter.WriteAttributeString("type", propertyOfValueProperty.GetType().ToString()); //den Klassentypen als Attribute an das Element hängen
                                            xmlWriter.WriteString(propertyOfValueProperty.ToString()); //den Wert der Eigenschaft schreiben
                                            xmlWriter.WriteEndElement();*/
                                    }
                                    else //Wenn der gesuchte Wert nur ein Wert ist, dann:
                                    {
                                        xmlWriter.WriteStartElement(propOfComponent.Name); //Den Namen der Eigenschaft schreiben
                                        xmlWriter.WriteAttributeString("type", propertyValue.GetType().ToString()); //den Klassentypen als Attribute an das Element hängen
                                        xmlWriter.WriteString(propertyValue.ToString()); //den Wert der Eigenschaft schreiben
                                        xmlWriter.WriteEndElement();
                                    }
                                }
                                else //wenn der Wert null ist, dann
                                {
                                    xmlWriter.WriteStartElement(propOfComponent.Name); //Den Namen der Eigenschaft schreiben
                                    xmlWriter.WriteAttributeString("type", "null"); //den Klassentypen als Attribute an das Element hängen
                                    xmlWriter.WriteString("null"); //den Wert der Eigenschaft schreiben
                                    xmlWriter.WriteEndElement();
                                }
                            }
                            catch (Exception e)
                            {
                                Debug.LogWarning("SavegameManager: Property \"" + propOfComponent.Name + "\" could not be saved:\n" + e);
                            }
                        }
                        xmlWriter.WriteEndElement();
                    }
                    xmlWriter.WriteEndElement();
                    xmlWriter.WriteEndDocument();
                }
            }

09.08.2015 - 15:29 Uhr

Entschuldigt.

Habe währenddessen du den Beitrag erstellt hast, folgendes geändert:


public static void Add(UnityEngine.Object pUnityObject)
    {
        Type type = pUnityObject.GetType();
        PropertyInfo[] properties = type.GetProperties();
        foreach (PropertyInfo property in properties)
        {
            string fieldName = property.Name;
            object fieldValue = property.GetValue(pUnityObject, null);
            Debug.Log(fieldName + " = " + fieldValue);
        }
    }

properties hat 34 Einträge.
Sollte also erstmal klappen.

Ich bedanke mich für die Unterstützung.

09.08.2015 - 15:03 Uhr

Ist Dein Field überhaupt public, wie es laut Beschreibung von GetFields auch sein muss?
Eigenschaften statt Fields sind für Dich nichts? Generics mit Interfaces Constrants auch nichts?
Mir scheints hier noch ein paar Grundlagendefizite zu geben.

Grundlagendefizite ist schon etwas arg heftig formuliert.

Ich habe mich evtl nicht genau ausgedrückt, könnte daran liegen.

Ich habe gefragt wie ich die Attribute einer Klasse auslesen kann und mir wurde gesagt, dass man diese Felder nennt.

Generics fällt raus, da unterschiedliche Objekte mit unterschiedlichen Eigenschaften speichern will. (Attribute war also nicht das richtige Wort)

Irgendwie finde ich den Unterschied zwischen Feld und Eigenschaft nicht.

Die Felder sind public:


public class CharStatSystem : MonoBehaviour
{
    //Eigenschaften
    //Standard-Eigenschaften
    public int ID {get; set;}
    public string nameItem { get; set; }
    public string description { get; set; }

    //Basis-Eigenschaften
    public float strength { get; set; }
    public float agility { get; set; }
    public float dexterity { get; set; }

    //Generierte-Eigenschaften
    public float lifepointsMax { get; set; } //ergibt sich aus Stärke(strength): Faktor ?
    public float lifepointsCurrent { get; set; } //ergibt sich aus lifepointsMax - Damage
    public float lifepointsRegeneration { get; set; } //ergibt sich aus Stärke(strength): Faktor ?
    public float damage { get; set; } //Klassenspezifisch
    public float armor { get; set; } //ergibt sich aus Stärke(strength): Faktor ?
    public float movementSpeed { get; set; } //ergibt sich aus Beweglichkeit(agility): Faktor ?
    public float movementSpeedMax { get; set; }
    public float maintaining { get; set; } //ergibt sich aus Geschicklichkeit(dexterity): Faktor ?

    //Zusätzliche-Eigenschaften
    public float experience { get; set; }
    public List<CharStatSystem> isUseableFrom { get; set; }
    //-> ABHÄNGIG von Gegenständen
    public CSSResistance resistance { get; set; } //Weitere Infos in der Basis-Resistenz-Klasse "CSSResistance"
    
...

09.08.2015 - 14:12 Uhr

GetField ist nur ab .NET 4 verfügbar
Alle (wichtigen) Type-Methoden existieren schon seit .NET 2.0, auch
>

In der Tat. Habe ich dann auch gesehen.

Ich habe nun folgenden Ansatz:


using UnityEngine;
using System.Collections;
using System;
using System.Reflection;

public static class SavegameManager // : MonoBehaviour
{
    public static void Add(System.Object pSystemObject)
    {
        Type type = pSystemObject.GetType();
        FieldInfo[] fields = type.GetFields();
        foreach (FieldInfo field in fields)
        {
            string fieldName = field.Name;
            object fieldValue = field.GetValue(field);
            Debug.Log(fieldName + " = " + fieldValue);
        }
    }

	public static void Add(UnityEngine.Object pUnityObject)
    {
        Type type = pUnityObject.GetType();
        FieldInfo[] fields = type.GetFields();
        foreach (FieldInfo field in fields)
        {
            string fieldName = field.Name;
            object fieldValue = field.GetValue(field);
            Debug.Log(fieldName + " = " + fieldValue);
        }
    }
     
    public static void Add(ScriptableObject pScriptableObject)
    {

    }

    public static void Save()
    {
        Add(new EarthSimilar());
        Add(PlayerController.selectedCharacter);
    }
}


Ich habe jedoch folgendes Problem:

FieldInfo[] fields = type.GetFields();

hat immer die Länge 0, also werden keine Felder gefunden.
Kann es damit zusammenhängen, dass meine Test-Objekte von anderen Klassen erben?

Bei Bedarf kann ich diese auch anfügen.

06.08.2015 - 20:58 Uhr

Ja natürlich.
Ich werde morgen Abend mal ein wenig tüffteln und bei Fragen melde ich mich nochmal - vorher werde ich natürlich eure Beiträge genau durchlesen.

Danke

06.08.2015 - 20:14 Uhr

Ich habe mir eure Beiträge soeben angeguckt - eher überflogen als genau gelesen (habe gerade win10 Installationsprobleme).

GetField ist nur ab .NET 4 verfügbar, jedoch benutzt Unity5 nur .NET 2, also Serialisierung ?

Ich habe folgendes (https://bitbucket.org/alexzzzz/unity-c-5.0-and-6.0-integration/overview) vor einigen Tagen gesehen. Eine eurer Experten-Meinungen dazu wären nun sehr hilfreich.

Besteht also evtl. doch die Möglichkeit GetField zu benutzen?

Wieso würdet Ihr eher XML anstatt JSON nutzen?

Entschuldigt meine Bombardierung von Fragen.

06.08.2015 - 16:28 Uhr

Hi MrSparkle,
es handelt sich um ein Spiel.
Ich möchte die Felder der Objekte in eine Datei speichern und habe gedacht, dass JSON eine Lösung dazu ist.

Die Dictionary ist nach Spielneustart nicht mehr vorhanden, deswegen nutze ich diese nicht.

Über Reflection würde das gehen.

Das hier ?
https://msdn.microsoft.com/de-de/library/z919e8tw

06.08.2015 - 15:55 Uhr

Hallo Community,
lange her, dass ich mal wieder eine Frage habe:

Kann man zur Laufzeit auf den Namen eines Attributes zugreifen?


string titel = "ritter der kokosnuss"

Ich hatte mir überlegt Objekte via (mini)JSON zu speichern und möchte gerne das Objekt als Parameter übergeben und die Variablen/Attribute des Objekts auslesen, also auf "titel" als string zugreifen.
Da das Objekt unterschiedliche Attribute hat, fällt ein statisches Auslesen von Attributen weg:
Ich könnte die Attribute manuell festlegen, also: jedes Objekt hat die Variable "titel", "preis", usw - dem ist aber nicht so, deswegen die dynamische "Abfrage" wie viele und welche Attribute das Objekt hat.

Habe ich mich verständlich ausgedrückt ?
Ich freue mich über jegliche Form von Unterstützung.

05.11.2013 - 09:17 Uhr

...selbst schreiben?!

Wie ?
Wenn ich doch wüsste, hätte ich den Thread nicht erstellt.

Ich will ja kein Quellcode. Nur fehlt mir noch das Verständnis.

04.11.2013 - 23:53 Uhr

Komischer Weise habe ich keine eMail bekommen, in der steht, dass ihr euch bereits Gedanken gemacht habt. 😐

Deswegen melde ich mich jetzt erst.

Wenn Du Magic Pakete versenden willst, dann brauchst Du eine Zwischenstation.
Sprich Du kontaktierst einen Mittelmann (zB einen Service) im Ziel-Netz und dieser versendet das Magic Paket in seiner Sektion.

Wie kann ich so einen Service/Mittelmann benutzen ?
Welchen Service schlägst du vor ?

Ich benutze Windows 7, jedoch trotzdem danke für den Hinweis.

02.11.2013 - 19:32 Uhr

Ist meine Frage so blöd, oder kennt sich niemand mit Magic Packet aus ?

01.11.2013 - 18:18 Uhr

Hallo Leute,

ich habe neulich meinen Barebone mal wieder eingerichtet / aufgestellt / in Benutzung.

Nun habe ich die Funktion Wake-on-Lan eingestellt und im lokalem Netz funktionierts ohne Probleme.

Meine Frage an euch ist:

Wie kann ich das Magic-Packet über's Internet versenden ?
Bzw. habe ich folgendes schon eingerichtet:

dns - selfhost.de (funktioniert)
fritz.box - Wake-On-Lan_Einstellung Häckchen gesetzt [Computer starten (funktioniert)]
[Anhang "Unbenannt.png"]

Nun habe ich ein Wake-On-Lan_Programm im lokalem Netzwerk gestartet (wie schon erwähnt, klappt es).
[Anhang (nächster Post)]

Ein Freund hat für mich dann das selbe Programm über die externe IP (dns / selfhost.de) getestet, funktioniert nicht:
Ich denke das liegt an dem Eintrag der Subnetmask. Ebenso daran, dass der DNS nur die IP des Routers weitergibt.

Ich bin bezüglich Netzwerktechnik nicht der Überflieger 😛

UND ich würde das ganze hier nicht fragen, wenn ich nicht mein eigenes Wake-On-Lan_Programm schreiben wollen würde. (dazu aber erst Infos, wenn die Theorie soweit stimmt)

Danke Ismoh

22.02.2012 - 19:03 Uhr

@trib:
Danke für deinen Beitrag.

Die Software kann ich downloaden, aber nicht starten, da man ANGEBLICH per eMail einen Trial-Key oder auch Key zugeschickt bekommt...

Nach 15 Anfragen hatte ich es dann aufgegeben.

Zu Serial Port Monitor:> Fehlermeldung:

Treibermanager: Device Monitor Helper kann nicht gestartet werden Fehlermeldung:
Sicherheitsprüfung: Sie besitzen die erforderlichen Rechte nicht, um die Anwendung zu starten. Bitten Sie ihren Administrator um Gewährung entsprechender Rechte.

Ich kann das Programm nicht starten, obwohl ich Admin bin.
Hast du vielleicht eine Problemlösung dazu?
Bringt mir das Programm überhaupt was, wenn ich die Software nicht starten kann?

Was mir eingefallen ist:
Da ich die Software downloaden kann, könnte ich doch den gewünschten Befehl suchen oder nich?
Das Programm ist in Phyton geschrieben und ich bräuchte dann nur noch einen Decompiler?!?!
Was sagt ihr dazu?

17.02.2012 - 23:48 Uhr

Das habe ich mir auch schon gedacht...

Ich vermute schwer, dass du vollkommen recht hast und somit hat sich das Geplänkel auch erledigt...
Leider 😭

Also es gibt wohl eine Software, aber die ist nicht vom selben Anbieter.

Kennen Sie vielleicht eine Dokumentationseite, bzw einfache Wiki über die ComPort-Schnittstelle?

Ich würd mal sagen, dieser Topic kann geschlossen werden.

17.02.2012 - 22:22 Uhr

Stimmt wohl...

ich hatte vorerst sp.ReadLine() getestet, führt aber zum selben Fehler.
Dann wollte ich einfach stumpf alle methoden testen und hoffte, dass irgendwas im textfeld steht.
fukntioniert aber nicht...

Das Problem ist, dass der Hersteller weder Datenblätter noch sonst was zur Verfügung stellt, bzw ich finde keine vernünftige Beschreibung im Inet.
Hinzukommt, dass in der Beschreibung nur steht: "Mit dem Adapter-Kabel können Sie das Ziel mit dem PC verbinden"
hilfreicher gehts kaum...

Deswegen steh ich irgendwie aufm Schlau und dachte, dass vielleicht jemand ein Tipp hat, wo ich anfangen soll das Problem zu lösen...

Trotzdem danke für deine Antwort

17.02.2012 - 17:37 Uhr

Hallo Leute,
ich habe folgendes Problem und zwar möchte ich abfragen wie oft der Schütze das Ziel getroffen hat.
Es handelt sich um ein Biathlon-Laser-Set (LaserPower II Profiset).

Da ich leider nicht viel Ahnung von der Materie habe, wollte ich bevor ich euch mit Quelltext Fragen "beschieße", erstmal fragen wie ich an die Sache ran gehen soll.

Zuerst habe ich versucht die serielle Schnittstelle COM4 über folgenden Code anzusprechen:


try
            {
                if (!sp.IsOpen) sp.Open();
                txtText.Text = "";
                txtText.Text = "|Byte|" + sp.ReadByte() + "|Char|" + sp.ReadChar() + "|Existing|" + sp.ReadExisting() + "|Line|" + sp.ReadLine() + "|To12|" + sp.ReadTo("12");
                sp.Close();
            }
            catch (System.Exception ex)
            {
                baudRatelLabel.Text = ex.Message;
            }

Folgende Fehlermeldung wird angezeigt: > Fehlermeldung:

Timeout für den Vorgang wurde überschritten.

Dann habe ich mir die Frage gestellt, ob meine Idee vielleicht total falsch ist, weil ich nun die COM4 Schnittstelle abfrage, wobei ich das "Ziel" mit einem RS485->USB-Adapter-Kabel an meinem Rechner angeschlossen habe.
Müsste ich dann nicht den USB-Slot nach Daten abfragen oder wie sieht das aus?

Wäre schön, wenn jemand, der sich damit auskennt, seinen "Senf" dazu geben würde.

Vielen Dank
MfG Ismoh

18.11.2011 - 21:50 Uhr

!CLOSED!

Ich habe mal im Internet nach Proxy Einstellungen gesucht und bin auf folgendes gestoßen:

bitte mal folgendes machen: Start -> Systemsteuerung -> Internet Einstellungen -> Reiter "Verbindungen", Schaltfläche "LAN-Einstellungen". Wenn da ein Proxy aktiviert ist, bitte die Markierung rausnehmen.

Wie sich herausgestellt hat, hatte ich dort einen Proxy eingestellt! (Habe ich nicht...war wahrscheinlich son beknacktes Eduroam Zertifikat!)

Trotzdem danke für die Hilfe...

Progg funktioniert nun!

MfG
Ismoh

18.11.2011 - 17:04 Uhr

Nutze keinen Proxy...
EDIT:(wobei ich in der Fachhochschule Eduroam-Zertifikate installiert habe und dort nutze ich einen Proxy. Beeinflussen die Zertifikate nun auch auf mein "Home"-Internet?)

Versuchs mal mit "passive" als Übertragungsmethode Was meinst du damit?

In dieser Zeile kommt der Fehler:

 Stream ftpstream = ftp.GetRequestStream();

Ip ist die richtige.

18.11.2011 - 15:40 Uhr

Hey Leute,
ich habe ein Problem bei meinem Programm und zwar kann ich keine Datei auf meinen WebServer uploaden.
Bekomme immer wieder die selbe Fehlermeldung...
Außerdem kann ab und an "keine Verbindung zum Remoteserver erstellt werden"...

Ich hoffe ihr könnt mir weiterhelfen.

Erst Externe IP ermitteln...


private void GetExtIP()
{
	try
	{
		WebRequest hwr = HttpWebRequest.Create(new Uri("http://checkip.dyndns.org";));
		WebResponse wr = hwr.GetResponse(); Stream stream = wr.GetResponseStream();
		StreamReader streamReader = new StreamReader(stream, Encoding.UTF8);
		string htmlResult = streamReader.ReadToEnd();
		string[] htmlSplit = htmlResult.Split(new string[] { ":", "<" }, StringSplitOptions.RemoveEmptyEntries);
		ExtIP = htmlSplit[6].Trim();
		stream.Close();
		wr.Close();

		StreamWriter extIPSave = File.CreateText(TempPfad);
		extIPSave.Write(ExtIP);
		extIPSave.Close();
	}
	catch (Exception e)
	{
		MessageBox.Show(e.Message,"Server IP ermitteln";);
	}
		
	lBClientUsed.Items.Add("Server IP: " + ExtIP+":1337";); UploadExtIP();
}

Danach Externe IP hochladen...


private void UploadExtIP()
{
	try
	{
		string ftpfullpath = "...../sonstiges/lan/lan-manager/ExtIP.lan";
		FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create(ftpfullpath);
		ftp.Credentials = new NetworkCredential("xx", "xx";);
		ftp.KeepAlive = true;
		ftp.UseBinary = true;
		ftp.Method = WebRequestMethods.Ftp.UploadFile;
		FileStream fs = File.OpenRead(TempPfad);
		byte[] buffer = new byte[fs.Length];
		fs.Read(buffer, 0, buffer.Length);
		fs.Close();

		Stream ftpstream = ftp.GetRequestStream();
		ftpstream.Write(buffer, 0, buffer.Length);
		ftpstream.Close();
	}
	catch (Exception e)
	{
		MessageBox.Show(e.Message, "Server IP uploaden";);
	}
}

Im Anhang findet ihr die Fehlermeldungen...

Vielen Dank für die Hilfe!

MFG
Ismoh


EDIT:
IP ermitteln funktioniert komischerweise nun jedes mal beim debuggen...

18.03.2010 - 13:35 Uhr

Läuft alles so wie ich/chef sich das vorgestellt hat

danke euch
mfg
ismoh

18.03.2010 - 10:32 Uhr

Quellcode is noch ohne OnPaint...

da gibts schon die 2te frage:

wie ihr auf dem foto seht, ist dort eine maskedtextbox, in der ein dual wert in 16bit angegebn werden soll. je nach wert soll sich der zeiger entsprechend bewegen.
wie kann man das einstellen, dass sich nach jeder wert änderung sich der zeiger automatisch bewegt ohne dass man vorher auf einen button klicken muss.

ich versuche ma die OnPaint-methode zu benutzen...
danke
ismoh

18.03.2010 - 09:58 Uhr

aso okey danke euch

@inflames2k:


Graphics G = pictureBox1.CreateGraphics();
Pen Zeiger = new Pen(Color.Red, 3);

Point ZeigerX = new Point(pictureBox1.Height / 2, pictureBox1.Width / 2);
Point ZeigerY = new Point(pictureBox1.Width / 2, pictureBox1.Height / 2);

Matrix X = new Matrix();
int grad = Convert.ToInt32(zahlenUpDown.Value);

X.RotateAt(grad, new Point(pictureBox1.Width / 2, pictureBox1.Height / 2));
G.Transform = X;
G.SmoothingMode = SmoothingMode.AntiAlias;
pictureBox1.Refresh();
G.DrawLine(Zeiger, ZeigerX, ZeigerY);
G.Dispose();

18.03.2010 - 09:26 Uhr

moin
sobald die messagebox erscheint und ich diese schließe ist der zeiger weg...
woran liegt das?
am refresh befehl?
im anhang findet ihr die bilder

mfg ismoh

17.03.2010 - 07:57 Uhr

5€ im jahr = unbegrenzt kaffe trinken
wir sind 12mitarbeiter und haben erstklassigen Kaffe, Tee & Wasser