【问题标题】:How to get a inherited object member from a list with lambda expression如何使用 lambda 表达式从列表中获取继承的对象成员
【发布时间】:2020-02-05 13:32:29
【问题描述】:

我的问题是我如何必须从 List<ExportData> 将对象转换为 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;
        }

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

【问题讨论】:

    标签: c# list lambda casting inherited


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      或使用FirstOrDefault 后跟显式转换。

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

      【讨论】:

      • 谢谢,我认为这对我来说是最好的解决方案,因为空条件测试。
      【解决方案3】:

      试试这个:

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

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

      【讨论】:

      • "假设列表中总是有一个 CyclicData 的实例,否则你会得到一个异常。".不,OfType 不会出现异常,Cast 不会出现异常。
      • @OusmaneD.AddressByte 的例外,而不是 OfType 的例外
      • 好吧,我明白了。可以用空条件运算符解决。
      • 好。我没有使用它,因为原始代码应该是一样的。
      • 好的。很公平。
      猜你喜欢
      • 2011-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      相关资源
      最近更新 更多