Jump to content
Unity Insider Forum
Thariel

Xml mit reflection zu Dictionary konvertieren. Wie typeof() von Key und Value erhalten?

Recommended Posts

Hi

Ich entwickle gerade eine Klasse, um beliebige Objekte in XML und wieder zur├╝ck zu konvertieren. Ist alles ziemlich schwierig┬á­čś«

Jetzt versuche ich gerade, aus dem XML das Dictionary "stats" wiederherzustellen.

<?xml version="1.0" encoding="utf-8"?>
<XmlTest>
  <health>10</health>
  <speed>3.5</speed>
  <isDeath>false</isDeath>
  <stats>                    <!--Dictionary-->
    <row>
      <key>strength</key>
      <value>5</value>
    </row>
    <row>
      <key>armor</key>
      <value>0</value>
    </row>
  </stats>
</XmlTest>

Das XElement "stats" ├╝bergebe ich also meiner Funktion:

public static void GetDictionaryFromXElement(XElement elDictionary, object obj, PropertyInfo prop)
    {
        var dict = (IDictionary)Activator.CreateInstance(prop.GetType());
        foreach (XElement elRow in elDictionary.Elements())
        {
            object key;
            if (dict.Keys.GetType() == typeof(int))
            {
                string sValue = elRow.Element("key").Value;
                int i = 0;
                int.TryParse(sValue, out i);
                key = i;
            }
            else
                Debug.LogError("Variable type not handled: " + prop.PropertyType);
            /// hier ein teil ausgeschnitten um das script k├╝rzer zu halten
            dict.Add(key, value);
        }
        prop.SetValue(obj, dict);
    }

Jetzt habe ich das Problem, dass dict.Keys.GetType() nicht den typ des "Keys" zur├╝ck gibt, sondern "System.Collections.Generic.Dictionary`2[System.String,System.String]". Trotz Suche habe nicht nicht herausgefunden, wie ich das Dictionary f├╝llen kann, ohne vorher den Datentyp zu kennen. Ich m├╝sste einfach den Datentyp des "Key" und des "Value" Wertes wissen, damit ich das ganze abarbeiten kann.

Wer kann mir da helfen?

Share this post


Link to post
Share on other sites

Jetzt hab ichs raus gefunden!

Type[] arguments = prop.GetValue(obj).GetType().GetGenericArguments();
Type keyType = arguments[0];
Type valueType = arguments[1];

Type dictType = typeof(Dictionary<,>).MakeGenericType(keyType, valueType);
var dict = Activator.CreateInstance(dictType);

 

  • Like 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...