簡體   English   中英

如何從具有 lambda 表達式的列表中獲取繼承的 object 成員

[英]How to get a inherited object member from a list with lambda expression

我的問題是如何從List<ExportData>將 object 轉換為 lambda 表達式,以便我可以直接從class CyclicData訪問成員AddressByte

請不要描述沒有 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;
        }

有誰知道是否以及如何做到這一點?

嘗試這個:

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

假設列表中總是有一個 CyclicData 的實例,否則你會得到一個異常。

您可以使用OfType (根據CyclicData過濾list的元素),然后使用FirstOrDefault

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

或使用FirstOrDefault后跟顯式強制轉換。

string addressByte = ((CyclicData)list.FirstOrDefault(x => x is CyclicData))?.AddressByte; 

進行這種繼承[它顯然違反了 LSP 規則] 並將代碼編寫到抽象中並不是一個好習慣。 為了從 null 異常中避免這一點

var addressByte = list.Where(x => x.GetType() == typeof(CyclicData)).FirstOrDefault();
if(addressByte !=null)
{
// do you logic here
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM