I want to create different types based on some text. I have tried the following without success:
JSON input:
[{"Type":"Book","Details":{"Name":"Book1","Chapter":"1","StartPage":"5","EndPage":"23"}},{"Type":"WebPage","Details":{"Name":"Page1","Url":"sometesturl.com","PageTypeIDs":"1"}}]
Since I do not want to change code every time a new type is added I tought reflection might be the solution.
List<Source> sources = new List<Source>();
dynamic[] items = jsSerializer.Deserialize<dynamic>(validjson);
foreach (var item in items)
        {
            string type = item["Type"];
            string serialized = jsSerializer.Serialize(item["Details"]);
            Type t = Type.GetType(type);
            var instance = createInstanceFromJSON(t, serialized);
            sources.Add(instance);
        }
Will give the following error: 'Cannot be converted from 'System.Type' to 'ProjectManager.Sources'' note that the type is in a seperate DLL called ProjectManager.
Here's the method:
private T createInstanceFromJSON<T>(T type, string json) where T : class
    {
        ConstructorInfo construtorInfo = typeof(T).GetConstructor(new[] { typeof(string) });
        ParameterInfo contructor = construtorInfo.GetParameters()[0];
        object defaultValue = contructor.DefaultValue;
        var item = (T)Activator.CreateInstance(typeof(T), defaultValue);
        item = jsSerializer.Deserialize<T>(json);
        return item;
    }
Aucun commentaire:
Enregistrer un commentaire