来自不同类的C#单个列表

时间:2018-11-16 11:42:16

标签: c# list

我在API上有两个部分,它们具有一些相似之处,但功能不同。我目前正在尝试从B类的人员的列表对象中获取数据,并将此数据添加到从A类创建的人员的列表中(希望解释得足够好?)

两个类中的人员结构实际上是相同的:

[XmlRoot(ElementName = "people")]
public class People
{
        [XmlElement(ElementName = "member")]
        public List<Member> Member { get; set; }
}


[XmlRoot(ElementName = "member")]
public class Member
{
    [XmlElement(ElementName = "firstName")]
    public string FirstName { get; set; }
    [XmlElement(ElementName = "lastName")]
    public string LastName { get; set; }
    [XmlAttribute(AttributeName = "memberId")]
    public string MemberId { get; set; }
    [XmlAttribute(AttributeName = "memberNotes")]
    public string Notes { get; set; }
    [XmlElement(ElementName = "departed")]
    public string Departed { get; set; }
    [XmlElement(ElementName = "currentPosition")]
    public Name CurrentPosition { get; set; }
}

在正常操作中,以下代码将“人员”列表设置得很好:

public People PersonData { get; set; }
...
....
var results = ApiA.People;
PersonData = results.Member; //during normal operation only one entry of member is returned

但是,在另一个操作中,结果返回较大的成员对象列表,因此我尝试添加到同一列表中,以确保以后由于相同的数据结构而对这两个操作使用单一方法进行处理,我尝试的是如下:

if(PersonData == null)
    PersonData = new API_A.People();


var results = ApiB.People; //person data here belongs to API_B.Person


foreach (var res in results)
{
    if (res?.Member != null)
    {
        if (PersonData == null)
        {
            PersonData.Member.AddRange(res.People.Member.Cast<API_A.Member>());
            break;
        }
        else
            PersonData.Member.Union(res.People.Member.Cast<API_A.Member>());
    }
}

在ide中没有错误返回,但是在操作期间,我在添加范围操作期间不断收到NullReferenceException;所以当我仍在学习时,我将非常感谢了解我在这里做错了什么?

1 个答案:

答案 0 :(得分:1)

两个问题很明显。

如果PersonData为空,则无法在首先创建PersonData.Member对象之前访问PersonData。因此,在您的情况下应该是:

PersonData = new People();

下一个问题是转换。即使在2个不同的类中所有内容都相同,除非它们之间没有继承关系,否则您不能将它们强制转换为另一个。您应该做的是将一个班级映射到另一个班级。只需在其他地方创建一个映射器方法即可将您的API_A.Member映射到API_B.Member,反之亦然。这种映射解决方法已被广泛使用,创建这种笨拙的映射方法时请放心。

示例:

API_A.Member MapBToA(API_B.Member member)
{
    return new API_A.Member {
        CharacterName = member.CharacterName,
        ...
    };
}