通用数组构造函数

时间:2017-12-23 07:59:40

标签: c# json unity3d

这是我的代码,它将Json转换为我自己的类:

JSONArray boats = p["data"]["game"]["start"]["boats"].AsArray;
j.data.game.start.boats = new JsonGameDetailBoat[boats.Count];
for (int i = 0; i < boats.Count; i++) {
    JSONNode boat = boats[i];
    j.data.game.start.boats[i] = new JsonGameDetailBoat {
        name = boat["name"],
        total = boat["total"]
    };
}
JSONArray board = p["data"]["game"]["board"].AsArray;
j.data.game.board = new JsonGameDataCell[board.Count][];
for (int i = 0; i < board.Count; i++) {
    /* almost same code than previous loop */
}

观察最后几行:我必须制作另一个循环,以做同样的事情。

我将不得不再做4次。

所以我试图制作一个将JSONArray转换为自定义类的泛型,并获取字符串的每个属性并从JSON数组中读取它们。

我的代码看起来像这样,但它不起作用,我不知道是否可以枚举类的公共属性。

public class JSONArrayConverter<T>
{
    public JSONArrayConverter(JSONNode p)
    {
        JSONArray tab = p.AsArray;
        IList<T> result;
        for (int i = 0; i < tab.Count; i++) {
            JSONNode value = tab[i];
            result[i] = new <T>();
        }
    }
}

此代码不起作用,我被困在这里:result[i] = new <T>();

1 个答案:

答案 0 :(得分:2)

您可以使用反射

public JSONArrayConverter(JSONNode p)
{
    JSONArray tab = p.AsArray;
    IList<T> result = new List<T>();
    for (int i = 0; i < tab.Count(); i++)
    {
        JSONNode value = tab[i];
        result[i] = (T)Activator.CreateInstance(typeof(T), value);
    }
}

或界面:

public interface JSONConvertable
{
    void Initialise(JSONNode node);
}

public class JSONArrayConverter<T> where T : JSONConvertable, new()
{
    public JSONArrayConverter(JSONNode p)
    {
        JSONArray tab = p.AsArray;
        IList<T> result = new List<T>();
        for (int i = 0; i < tab.Count(); i++)
        {
            JSONNode value = tab[i];
            result[i] = new T();
            result[i].Initialise(value);
        }
    }
}

编辑:

或回调

public JSONArrayConverter(JSONNode p, Func<JSONNode, T> creator)
{
    JSONArray tab = p.AsArray;
    IList<T> result = new List<T>();
    for (int i = 0; i < tab.Count(); i++)
    {
        JSONNode value = tab[i];
        result[i] = creator(value);
    }
}