[英]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.