C# 我在Unity中使用嵌套类时遇到一些问题

C# 我在Unity中使用嵌套类时遇到一些问题,c#,json,unity3d,C#,Json,Unity3d,我想我在解释我的意思时遇到了一些问题,所以我要解释一下我做了什么,我的代码从一开始就变成了什么 我有一段代码可以将我的数据保存到json中,它工作正常,可以完美地打印json 脚本:GiftValue [SerializeField] public class Gift { public int GValue public string GName public int GAmount public float GWeight } 脚本:EditAdd

我想我在解释我的意思时遇到了一些问题,所以我要解释一下我做了什么,我的代码从一开始就变成了什么

我有一段代码可以将我的数据保存到json中,它工作正常,可以完美地打印json

脚本:GiftValue

[SerializeField]
 public class Gift
 {
    public int GValue 
    public string GName 
    public int GAmount
    public float GWeight
 }
脚本:EditAddGift

 [SerializeField]
 public List<Gifts> _Gift = new List<Gifts>();

///those code above is what i missing before.
 Gifts NewGift = new Gifts
    {
        GValue = DropDownValueGift,
        GName = ifGiftDetailName.text,,
        GAmount = iAmount,
        GWeight = fWeight,


    };
_Gift.Add(NewGift);
SaveToJson(_Gift, DATABASE_NAME);
最后,我的json文件如下所示

    [
      {
        "GValue": 1,
        "GName": "Gift 3",
        "GiftDetail": 
        [
        {
          "GDetailValue": 3,
          "GDetailName": "2",
          "GDetailWeight": 3.0,
          "GDetailAmount": 4
        },
        {
          "GDetailValue": 3,
          "GDetailName": "2",
          "GDetailWeight": 3.0,
          "GDetailAmount": 4
        }

        ],
      },
]
我以前试过一些方法,比如把礼物换成公共类礼物。。但我认为我应该在它崩溃之前展示我的代码,以帮助你们更清楚地了解我想要实现的目标


在更改为礼品和礼品详情之前,我用来删除的代码

            if (_Gift.Exists(x => x.GValue== DropDownValuePhanQua ))
            {  

                int i = 0;        
                while (i <_Gift.Count && _Gift[i].GValue != DropDownValuePhanQua)
                        i++;
                _Gift.RemoveAt(i);

            }
            _Gift.Add(NewGift);
            SaveToJson(_Gift, DATABASE_NAME);
对此

[
{
    "GValue": 1,
    "GName": "Phần Quà 1",
    "GiftDetails": [
      {
        "GDetailValue": 5,
        "GDetailName": "3",
        "GDetailWeight": 2.0,
        "GDetailAmount": 4
      },
      {
        "GDetailValue": 3,
        "GDetailName": "new Gift",
        "GDetailWeight": 33.0,
        "GDetailAmount": 3
      }
    ]
  }
]

几乎没有办法。这里有一个

拥有

[System.Serializable]
public class GiftDetail
{
    public int GDetailValue;
    public string GDetailName;
    public double GDetailWeight;
    public int GDetailAmount;
}

[System.Serializable]
public class Gift
{
    public int GValue;
    public string GName;
    public List<GiftDetail> GiftDetails; // Added 's'
}
[System.Serializable]
公共类礼品详情
{
公共价值;
公共字符串GDetailName;
公共双倍体重;
公共内特格迪拉蒙特;
}
[系统可序列化]
公共类礼物
{
公共价值;
公共字符串GName;
公共列表GiftDetails;//添加了's'
}
你可以

GiftDetail NewGiftDetail = new GiftDetail
{
    GDetailValue = DropDownValueGiftDetail,
    GDetailAmount = iAmount,
    GDetailName = ifGiftDetailName.text,
    GDetailWeight = Fweight,
};

GiftDetail NewGiftDetail2 = new GiftDetail
{
    //(...)
};

Gift NewGift = new Gift  //Gift - not gifts
{
    GValue = 1,
    GName = "One",
    GiftDetails = new List<GiftDetail>() { NewGiftDetail, NewGiftDetail2 }
};

GiftDetail d3 = new GiftDetail
{
    //(...)
};

NewGift.GiftDetails.Add(d3);
// NewGift has now 3 details
//Access first detail
NewGift.GiftDetails[0]; // Or .First() with 'using System.Linq`
GiftDetail NewGiftDetail=新GiftDetail
{
GDetailValue=DropDownValueGiftDetail,
GDetailAmount=iAmount,
GDetailName=ifGiftDetailName.text,
GDetailWeight=Fweight,
};
GiftDetail NEWTGIFTDETAIL 2=新GiftDetail
{
//(...)
};
礼品新礼品=新礼品//礼品-非礼品
{
GValue=1,
GName=“一”,
GiftDetails=new List(){NewGiftDetail,NewGiftDetail2}
};
GiftDetail d3=新GiftDetail
{
//(...)
};
NewGift.GiftDetails.Add(d3);
//NewGift现在有3个细节
//访问第一个详细信息
NewGift.GiftDetails[0];//或带“using System.Linq”的.First()`

方法很少。这里有一个

拥有

[System.Serializable]
public class GiftDetail
{
    public int GDetailValue;
    public string GDetailName;
    public double GDetailWeight;
    public int GDetailAmount;
}

[System.Serializable]
public class Gift
{
    public int GValue;
    public string GName;
    public List<GiftDetail> GiftDetails; // Added 's'
}
[System.Serializable]
公共类礼品详情
{
公共价值;
公共字符串GDetailName;
公共双倍体重;
公共内特格迪拉蒙特;
}
[系统可序列化]
公共类礼物
{
公共价值;
公共字符串GName;
公共列表GiftDetails;//添加了's'
}
你可以

GiftDetail NewGiftDetail = new GiftDetail
{
    GDetailValue = DropDownValueGiftDetail,
    GDetailAmount = iAmount,
    GDetailName = ifGiftDetailName.text,
    GDetailWeight = Fweight,
};

GiftDetail NewGiftDetail2 = new GiftDetail
{
    //(...)
};

Gift NewGift = new Gift  //Gift - not gifts
{
    GValue = 1,
    GName = "One",
    GiftDetails = new List<GiftDetail>() { NewGiftDetail, NewGiftDetail2 }
};

GiftDetail d3 = new GiftDetail
{
    //(...)
};

NewGift.GiftDetails.Add(d3);
// NewGift has now 3 details
//Access first detail
NewGift.GiftDetails[0]; // Or .First() with 'using System.Linq`
GiftDetail NewGiftDetail=新GiftDetail
{
GDetailValue=DropDownValueGiftDetail,
GDetailAmount=iAmount,
GDetailName=ifGiftDetailName.text,
GDetailWeight=Fweight,
};
GiftDetail NEWTGIFTDETAIL 2=新GiftDetail
{
//(...)
};
礼品新礼品=新礼品//礼品-非礼品
{
GValue=1,
GName=“一”,
GiftDetails=new List(){NewGiftDetail,NewGiftDetail2}
};
GiftDetail d3=新GiftDetail
{
//(...)
};
NewGift.GiftDetails.Add(d3);
//NewGift现在有3个细节
//访问第一个详细信息
NewGift.GiftDetails[0];//或带“using System.Linq”的.First()`

您能将一辆车转换成多辆车吗<代码>礼物获取一个
列表
,您正在提供一个
GiftDetail
对象。我确实尝试将GiftDetail NewGiftDetail=new GiftDetail更改为List NewGiftDetail=new List它解决了这个错误,但它告诉我GiftDetail中没有GDetailValue,可能是告诉您在
List
中没有GDetailValue,并不是说您在
GiftDetail
中没有
GDetailValue
。请仔细阅读编译器错误。9/10他们会告诉你到底出了什么问题。我这样说是因为有人盯着一个编译器警告看了5分钟,却看不出过去出了什么问题。我的错是,我只是检查了一下,它确实说了列表,我理解错误以及它告诉我要更改什么,问题是我不知道如何修复它。你上一次的作业毫无意义。首先,代码被编写成好像
Gift
是一个泛型类型,但这不是您在这里展示的
Gift
类。其次,将
NewGiftDetail
分配给
GiftDetail
属性。前者是
GiftDetail
的单个实例,而后者是
列表
。当然,不能将一个指定给另一个。也许你的意思是
GiftDetail=newlist{NewGiftDetail}
?至少,如果你想用你的问题发布代码(你应该这样做),代码应该是你正在使用的实际代码。你能把一辆车转换成多辆车吗<代码>礼物获取一个
列表
,您正在提供一个
GiftDetail
对象。我确实尝试将GiftDetail NewGiftDetail=new GiftDetail更改为List NewGiftDetail=new List它解决了这个错误,但它告诉我GiftDetail中没有GDetailValue,可能是告诉您在
List
中没有GDetailValue,并不是说您在
GiftDetail
中没有
GDetailValue
。请仔细阅读编译器错误。9/10他们会告诉你到底出了什么问题。我这样说是因为有人盯着一个编译器警告看了5分钟,却看不出过去出了什么问题。我的错是,我只是检查了一下,它确实说了列表,我理解错误以及它告诉我要更改什么,问题是我不知道如何修复它。你上一次的作业毫无意义。首先,代码被编写成好像
Gift
是一个泛型类型,但这不是您在这里展示的
Gift
类。其次,将
NewGiftDetail
分配给
GiftDetail
属性。前者是
GiftDetail
的单个实例,而后者是
列表
。当然,不能将一个指定给另一个。也许你的意思是
GiftDetail=newlist{NewGiftDetail}
?至少,如果你要用你的问题发布代码(你应该这样做),那么代码应该是你正在使用的实际代码。为了让Unity再次工作,你应该坚持使用字段而不是属性(删除所有
{get;set;}
),并使类
[Serializable]
。谢谢!我更新了代码。(这里没有团结经验)@tymtam谢谢^ ^,这就是我想要的。还有一件事,您知道如何访问GiftDetails.GDetailValue吗?NewGift仅允许我访问NewGift.GiftDetails。我需要GDetailValue从礼品a中删除礼品
List<GiftDetail> GiftDetailList =new List<GiftDetail>()
var GD1 = new GiftDetailList ()
{
          GDetailValue= 3,
          GDetailName= "2",
          GDetailWeight= 3.0,
          GDetailAmount= 4
}
    Gifts NewGift = new Gifts
    {
        GValue = DropDownValueGift,
        GName = txtDropDownGift,    
       GDteails=GiftDetailList 
    };
[System.Serializable]
public class GiftDetail
{
    public int GDetailValue;
    public string GDetailName;
    public double GDetailWeight;
    public int GDetailAmount;
}

[System.Serializable]
public class Gift
{
    public int GValue;
    public string GName;
    public List<GiftDetail> GiftDetails; // Added 's'
}
GiftDetail NewGiftDetail = new GiftDetail
{
    GDetailValue = DropDownValueGiftDetail,
    GDetailAmount = iAmount,
    GDetailName = ifGiftDetailName.text,
    GDetailWeight = Fweight,
};

GiftDetail NewGiftDetail2 = new GiftDetail
{
    //(...)
};

Gift NewGift = new Gift  //Gift - not gifts
{
    GValue = 1,
    GName = "One",
    GiftDetails = new List<GiftDetail>() { NewGiftDetail, NewGiftDetail2 }
};

GiftDetail d3 = new GiftDetail
{
    //(...)
};

NewGift.GiftDetails.Add(d3);
// NewGift has now 3 details
//Access first detail
NewGift.GiftDetails[0]; // Or .First() with 'using System.Linq`