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

Return the values of an object's properties using lambda expression (C#)

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

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

不产生错误:

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[=36= 的属性]空值?

这里是 class:

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 操作实现的目标的更多细节 - 我只是希望它 return 所有非空值属性 名称中包含“Anchors”的所有属性。

谢谢!

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

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

的事情
  • 要处理 get,它需要查找包含 Anchors.

    的所有内容
    • AnchorsData 包含 Anchors 因此必须处理 get.

      • 要处理 get,它需要查找包含 Anchors.

        的所有内容
        • AnchorsData 包含 Anchors 因此必须处理 get.

          • 要处理 get,它需要查找包含 Anchors.

            的所有内容
            • AnchorsData 包含 Anchors 因此必须处理 get.

              • ...

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

你在给自己打电话。不。无限递归不好。

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

这应该跳过递归(无论您是否正在测试 null/empty 属性都应该发生)并且只有 return 非空:

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