C# 自己的类对象属性被覆盖

C# 自己的类对象属性被覆盖,c#,C#,我用attributes字符串创建了一个对象,另一个是列表。 我还创建了一个静态列表,然后在其中添加所有对象。 现在我的问题是第二个属性被覆盖了 例如,我有3个对象: Object1: "Name"; List with 3 Strings Object2: "Name2"; List with 2 Strings Object3: "Name3"; List with 5 Strings 如果我现在将它们添加到我的对象列表中,看起来是这样的 Name; List with 5 Strings

我用attributes字符串创建了一个对象,另一个是
列表
。 我还创建了一个
静态列表
,然后在其中添加所有对象。 现在我的问题是第二个属性被覆盖了

例如,我有3个对象:

Object1: "Name"; List with 3 Strings
Object2: "Name2"; List with 2 Strings
Object3: "Name3"; List with 5 Strings
如果我现在将它们添加到我的对象列表中,看起来是这样的

Name; List with 5 Strings
Name2; List with 5 Strings
Name3; List with 5 Strings
它会将第二个属性覆盖到列表中的所有其他对象

代码:

for (int i = 0; i < 100; i++)
{
    if (elo.ReadObjMask(i) > 0)
    {
        var iRet = elo.PrepareObjectEx(0, 0, i); 
        maskenname = elo.ObjMName(); 
        if (maskenname != "")
        {
            for (int e = 0; e < 50; e++)
            {
                string eigenschaft = elo.GetObjAttribName(e); 

                if (eigenschaft != "" && eigenschaft != "-")
                {
                    eigenschaften.Add(eigenschaft); 
                }
            }
            allMasks.Add(maskenname); 

        }
        else 
        {
            // Do nothing
        }
        EloMask emask = new EloMask(maskenname, eigenschaften); 
        staticVariables.allMask.Add(emask); 
        eigenschaften.Clear(); 
    }
}
for(int i=0;i<100;i++)
{
如果(elo.ReadObjMask(i)>0)
{
var-iRet=elo.PrepareObjectEx(0,0,i);
maskenname=elo.ObjMName();
如果(maskenname!=“”)
{
对于(int e=0;e<50;e++)
{
字符串eigenschaft=elo.GetObjAttribName(e);
if(eigenschaft!=”&&eigenschaft!=“-”)
{
添加(eigenschaft);
}
}
添加(maskenname);
}
其他的
{
//无所事事
}
EloMask emask=新的EloMask(maskenname,eigenschaften);
staticVariables.allMask.Add(emask);
eagenschaften.Clear();
}
}
这是我的对象类:

public class EloMask
{
    public string name;
    public List<String> eigenschaften;

    public EloMask(string iname, List<String> ieigenschaften)
    {
        name = iname;
        eigenschaften = ieigenschaften;
    }
}
公共类掩码
{
公共字符串名称;
公开名单;
公共EloMask(字符串iname,列表ieigenschaften)
{
name=iname;
本征Schaften=ieigenschaften;
}
}

以下是一个示例,说明如何做您想做的事情:

    public static List<Person> PersonsList = new List<Person>();
    public static Random rd = new Random();
    static void Main(string[] args)
    {

        for (int i = 0; i < 5; i++)
        {
            List<string> tmpAbilities = new List<string>() {((char)rd.Next(255)).ToString(), ((char)rd.Next(255)).ToString() , ((char)rd.Next(255)).ToString() };
            Person tmpPerson = new Person("TmpName_"+i,tmpAbilities);
            PersonsList.Add(tmpPerson);
        }
        foreach (var persona in PersonsList)
        {
            Console.WriteLine(persona);
        }
    }


    public class Person
    {

        public string Name { get; set; }

        public List<string> Abilities;

        public Person(string name,List<string> abilities)
        {
            Name = name;
            Abilities = abilities;
        }

        public override string ToString()
        {
            string retVal = $"Name: {Name}\n";
            foreach (var ability in Abilities)
            {
                retVal += $"Ability : {ability}\n";
            }
            return retVal;
        }
    }
public static List PersonsList=new List();
公共静态随机rd=新随机();
静态void Main(字符串[]参数)
{
对于(int i=0;i<5;i++)
{
List tmabilities=new List(){((char)rd.Next(255)).ToString(),((char)rd.Next(255)).ToString(),((char)rd.Next(255)).ToString()};
人员tmpPerson=新人员(“TmpName_”+i,TMP能力);
PersonsList.Add(tmpPerson);
}
foreach(PersonList中的变量persona)
{
控制台。写线(人物角色);
}
}
公共阶层人士
{
公共字符串名称{get;set;}
公开列表能力;
公众人物(字符串名称、列表能力)
{
名称=名称;
能力=能力;
}
公共重写字符串ToString()
{
string retVal=$“Name:{Name}\n”;
foreach(能力中的var能力)
{
retVal+=$“能力:{Ability}\n”;
}
返回返回;
}
}
用于(int i=0;i<100;i++)
{
如果(elo.ReadObjMask(i)>0)
{
//在此处创建一个新列表
eigenschaften=新列表();
var-iRet=elo.PrepareObjectEx(0,0,i);
maskenname=elo.ObjMName();
如果(maskenname!=“”)
{
对于(int e=0;e<50;e++)
{
字符串eigenschaft=elo.GetObjAttribName(e);
if(eigenschaft!=”&&eigenschaft!=“-”)
{
添加(eigenschaft);
}
}
添加(maskenname);
}
其他的
{
//无所事事
}
EloMask emask=新的EloMask(maskenname,eigenschaften);
staticVariables.allMask.Add(emask);
}
}
列表始终指向同一个实例,因为您传递的是对列表的引用,而不是副本。因此,对于您将该列表传递到的每个
EloMask
,该列表将被清除并再次填充

要解决您的问题,请创建一个新列表:

if (elo.ReadObjMask(i) > 0)
{
    var iRet = elo.PrepareObjectEx(0, 0, i);
    maskenname = elo.ObjMName();

    // create a new list here!!!
    var eigenschaften = new List<string>();

    if (maskenname != "")
    {
        for (int e = 0; e < 50; e++)
        {
            string eigenschaft = elo.GetObjAttribName(e);

            if (eigenschaft != "" && eigenschaft != "-")
            {
                eigenschaften.Add(eigenschaft);
            }
        }

        allMasks.Add(maskenname);

    }

    EloMask emask = new EloMask(maskenname, eigenschaften);
    staticVariables.allMask.Add(emask);

    // clearing the list is no longer needed                   
}
if(elo.ReadObjMask(i)>0)
{
var-iRet=elo.PrepareObjectEx(0,0,i);
maskenname=elo.ObjMName();
//在这里创建一个新列表!!!
var eigenschaften=新列表();
如果(maskenname!=“”)
{
对于(int e=0;e<50;e++)
{
字符串eigenschaft=elo.GetObjAttribName(e);
if(eigenschaft!=”&&eigenschaft!=“-”)
{
添加(eigenschaft);
}
}
添加(maskenname);
}
EloMask emask=新的EloMask(maskenname,eigenschaften);
staticVariables.allMask.Add(emask);
//不再需要清除列表
}

您需要指定“Object”类的代码,以及实例化和添加到静态列表的方式。staticVariables.allMask.Add(emask);在这一部分中,我将其添加到我的静态列表中,我相信:EloMask emask=新的EloMask(maskenname,eigenschaften);正在将eigenschaften作为引用传递,因此当它被更改时,所有其他的都将被更改。在写入列表之前,需要启动列表的新实例。特征值=新列表;请尝试更改这一行:exigenschaften.Clear();to eigenschaften=新列表();天哪,太容易了!谢谢,这解决了我的问题!谢谢你,特洛伊!这里缺少()项:eigenschaften=新列表;没问题,我再次非常感谢你!我昨天挣扎了3个小时哈哈:D
if (elo.ReadObjMask(i) > 0)
{
    var iRet = elo.PrepareObjectEx(0, 0, i);
    maskenname = elo.ObjMName();

    // create a new list here!!!
    var eigenschaften = new List<string>();

    if (maskenname != "")
    {
        for (int e = 0; e < 50; e++)
        {
            string eigenschaft = elo.GetObjAttribName(e);

            if (eigenschaft != "" && eigenschaft != "-")
            {
                eigenschaften.Add(eigenschaft);
            }
        }

        allMasks.Add(maskenname);

    }

    EloMask emask = new EloMask(maskenname, eigenschaften);
    staticVariables.allMask.Add(emask);

    // clearing the list is no longer needed                   
}