0

我的问题是我如何必须在 lambda 表达式中转换一个对象,List<ExportData>以便我可以直接访问AddressByte成员class CyclicData

请不要描述我已经做过的没有 lambda 的任何解决方案。我的问题是这是否可以在一行代码中使用 lambda?

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

有谁知道是否以及如何做到这一点?

4

3 回答 3

0

进行这种继承[它显然违反了 LSP 规则] 并将代码编写到抽象中并不是一个好习惯。为了从空异常中避免这一点

var addressByte = list.Where(x => x.GetType() == typeof(CyclicData)).FirstOrDefault();
if(addressByte !=null)
{
// do you logic here
}
于 2019-10-08T09:33:14.703 回答
0

您可以使用OfType(过滤list 基于的元素CyclicData)后跟FirstOrDefault

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

或使用FirstOrDefault后跟显式强制转换。

string addressByte = ((CyclicData)list.FirstOrDefault(x => x is CyclicData))?.AddressByte; 
于 2019-10-08T09:22:37.263 回答
0

尝试这个:

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

假设列表中总是有一个 CyclicData 的实例,否则你会得到一个异常。

于 2019-10-08T09:21:31.280 回答