C # один список из разных классов - PullRequest
0 голосов
/ 16 ноября 2018

У меня есть 2 части API, которые имеют некоторые общие черты, но работают по-разному.В настоящее время я пытаюсь взять данные из объекта списка людей из класса B и добавить эти данные в список людей, созданных из класса A (надеюсь, достаточно хорошо объяснено?)

Структура People в 2 классахна самом деле то же самое:

[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

Однако в другой операции результаты возвращают список объектов-членов Larger, поэтому яя пытаюсь добавить к тому же списку, чтобы гарантировать, что обработка позже использует один метод для обеих операций из-за одной и той же структуры данных, я пытаюсь сделать следующее:

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>());
    }
}

Никаких ошибок не возвращаетсяно во время работы я постоянно получаю NullReferenceException во время операции добавления диапазона;так как я все еще учусь, я был бы очень признателен за понимание того, что я делаю здесь неправильно?

1 Ответ

0 голосов
/ 16 ноября 2018
Проблемы

2 очевидны.

Если PersonData имеет значение null, вы не можете получить доступ к PersonData.Member до создания объекта PersonData.Так что в вашем случае это должно быть:

PersonData = new People();

Следующая проблема, с которой вы столкнетесь, - это кастинг.Даже если в двух разных классах все одинаково, если между ними нет отношения наследования, вы не можете приводить один к другому.Что вы должны сделать, это сопоставить один класс с другим.Просто создайте метод сопоставления где-нибудь еще, который отображает ваш API_A.Member на API_B.Member и / или наоборот.Этот вид обходных путей широко используется, поэтому чувствуйте себя в безопасности, создавая этот тяжелый метод отображения.

Пример:

API_A.Member MapBToA(API_B.Member member)
{
    return new API_A.Member {
        CharacterName = member.CharacterName,
        ...
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...