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));
我的最终目标是使用单个 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));