Как получить член наследуемого объекта из списка с лямбда-выражением - PullRequest
0 голосов
/ 08 октября 2019

У меня вопрос, как мне сделать так, чтобы объект приводился в лямбда-выражении из List<ExportData>, чтобы я мог получить прямой доступ к члену AddressByte из class CyclicData?

Пожалуйста, не описывайтелюбые решения без лямбды, которые я уже сделал. У меня вопрос: возможно ли это с помощью лямбды в одной строке кода?

    public class ExportData
    {
        public string Designation { get; set; }
    }

    public class StaticData : ExportData
    {
        public string Value { get; set; }
    }

    public class CyclicData : ExportData
    {
        public string Block { get; set; }
        public string Typ { get; set; }
        public string AddressByte { get; set; }
        public string AddressBit { get; set; }
    }

        public void getMemberFromList()
        {
            List<ExportData> list = new List<ExportData>();
            list.Add(new CyclicData());
            list.Add(new StaticData());
            list.Add(new StaticData());

            //   get addressByte form Cyclic object with one line of code
            string addressByte = list.Where(x => x.GetType() == typeof(CyclicData)).FirstOrDefault().AddressByte; 
            //-> does not work because of missing cast to CyclicData;
        }

Кто-нибудь знает, если и как это можно сделать?

Ответы [ 3 ]

0 голосов
/ 08 октября 2019

Вы можете использовать OfType (который фильтрует элементы list на основе CyclicData) с последующим FirstOrDefault:

string addressByte = list.OfType<CyclicData>().FirstOrDefault()?.AddressByte;

или использовать FirstOrDefault с явным приведением.

string addressByte = ((CyclicData)list.FirstOrDefault(x => x is CyclicData))?.AddressByte; 
0 голосов
/ 08 октября 2019

Это не очень хорошая практика, чтобы делать такое наследование [оно явно нарушает правило LSP] и писать код в абстракцию. Чтобы защитить это от нулевого исключения

var addressByte = list.Where(x => x.GetType() == typeof(CyclicData)).FirstOrDefault();
if(addressByte !=null)
{
// do you logic here
}
0 голосов
/ 08 октября 2019

Попробуйте:

        string addressByte = list.OfType<CyclicData>().FirstOrDefault().AddressByte; 

Если в списке всегда есть экземпляр CyclicData, в противном случае вы получите исключение.

...