我的最终目标是使用单个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;锚"在财产名称。
谢谢!
答案 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));