使用lambda表达式返回对象属性的值(C#)

时间:2017-09-27 21:34:39

标签: c# arrays reflection lambda ienumerable

我的最终目标是使用单个lambda查询和反射从类及其属性生成一个字符串数组(string[])。

第一个代码块成功生成IEnumerable,而第二个代码块则没有。不同之处在于第二个块尝试过滤掉具有 值的属性。我唯一可以得出的结论是,我在第二种方法中的语法不知何故。

不产生错误:

var x = from p in GetType()
                 .GetProperties()
                 .Where(n => n.Name.Contains("Anchors"))
        select p.GetValue(this));

产生错误:

var x = from p in GetType()
                 .GetProperties()
                 .Where(n => n.Name.Contains("Anchors") & 
                     !string.IsNullOrWhiteSpace(n.GetValue(this).ToString()))
        select p.GetValue(this));

如何修改第二个表达式以过滤掉具有 null 值的属性?

这是班级:

public class DataPoint
{
    public string FI_Comments { get; set; }
    public string FI_DateInspected { get; set; }
    public string FI_Anchors1 { get; set; }
    public string FI_Anchors2 { get; set; }
    public string FI_Anchors3 { get; set; }
    public string FI_BoltsNuts1 { get; set; }
    public string FI_BoltsNuts2 { get; set; }
    public string FI_BoltsNuts3 { get; set; }
    public string FI_Conductors1 { get; set; }
    public string FI_Conductors2 { get; set; }
    public string FI_Conductors3 { get; set; }
    public string FI_Conductors4 { get; set; }
    public string FI_Conductors5 { get; set; }

    public string AnchorsData
    {
        get
        {
            return string.Join("\n", from p in GetType()
                                              .GetProperties()
                                              .Where(n => n.Name.Contains("Anchors"))
                                     select p.GetValue(this, null));
        }
    }

关于我在最后使用 get 操作尝试实现的更多细节 - 我只是希望它返回所有具有&#的属性的所有非空值34;锚"在财产名称。

谢谢!

4 个答案:

答案 0 :(得分:2)

  • 要处理get,需要查找包含Anchors的所有内容。

    • AnchorsData包含Anchors,因此必须处理get

      • 要处理get,需要查找包含Anchors的所有内容。

        • AnchorsData包含Anchors,因此必须处理get

          • 要处理get,需要查找包含Anchors的所有内容。

            • AnchorsData包含Anchors,因此必须处理get

              • ...

你看到了问题吗?这就是你得到堆栈溢出错误的原因。

答案 1 :(得分:1)

...(n.GetValue(this).ToString())...

我这就是问题所在。获得该值后,您尝试调用.ToString(),即使可能有null。尝试做?.ToString()

之类的事情

答案 2 :(得分:1)

你在称自己。别。无限递归不好。

return string.Join("\n", from p in GetType()
                                  .GetProperties()
                                  .Where(n => n.Name.Contains("Anchors") 
                                           && n.Name != "AnchorsData")  //<-- Don't call yourself!
                         select p.GetValue(this, null));

答案 3 :(得分:1)

这应该跳过递归(无论你是否测试null / empty属性都会发生这种情况)并且只返回非空的:

    return string.Join("\n", from p in GetType()
                                       .GetProperties()
                                       .Where(n => n.Name != "AnchorsData" && n.Name.Contains("Anchors") && !String.IsNullOrEmpty(n.GetValue(this)?.ToString()))
                             select p.GetValue(this));