gpt4 book ai didi

c# - 这个对象能够告诉它有多少属性不是空/空白/空有什么问题?

转载 作者:太空宇宙 更新时间:2023-11-03 18:26:03 24 4
gpt4 key购买 nike

我想弄清楚为什么以下代码会抛出 StackOverflowException(我终于在 SO 中发布了 StackoverflowException!)。

调试似乎指出 p.GetValue(this) 正在生成进一步的调用。

实际上是什么触发了无限调用链?是因为 p.GetValue(this) 最终返回当前对象的一个​​实例,因此就像构造一个新实例一样(并且在其构造中构造自身的每个对象都会导致 Stackoverflow 异常)?

我对以下代码的意图是让一个对象能够告诉它有多少属性具有 null/space/empty 值。

public class A
{
public string S1 { get; set; }
public string S2 { get; set; }

public int NonInitializedFields
{
get
{
int nonNullFields = 0;

var properties = this.GetType().GetProperties();
foreach (var p in properties)
{
var value = p.GetValue(this);
if (value == null || string.IsNullOrWhiteSpace(value.ToString()))
nonNullFields++;
}

return nonNullFields;
}
}
}

//the following throws a StackOverflowException (the construction line itself)
A a1 = new A1{ S1 = "aaa"};
Console.WriteLine(a1.NonInitializedFields);

附言我的想法最初只涉及简单的字符串属性,没有其他任何东西,所以无论这种方法与其他类型可能出现什么问题都是无关紧要的。

最佳答案

您有一个属性,当您执行“get”访问器时,它会找到所有属性 并获取它们的值。所以它会递归地执行自己。

如果您只需要字符串属性,您应该在获取值之前检查属性类型:

var properties = GetType().GetProperties().Where(p => p.PropertyType == typeof(string));

此时,由于您的 NonInitializedFields 属性没有 string 的返回类型,因此它不会被执行。

请注意,就我个人而言,无论如何,我会将其作为方法调用而不是属性。这也可以解决问题,因为该方法在查找属性时不会找到自己。

我也会将它重命名为:

  • 属性不一定由字段支持
  • 字段可以显式初始化为 null 或对仅包含空格的字符串的引用

IMO,名为 GetNonWhitespaceStringPropertyCount() 的方法会更准确。您还可以使整个实现成为 LINQ 查询:

return GetType().GetProperties()
.Where(p => p.PropertyType == typeof(string))
.Select(p => p.GetValue(this))
.Count(v => !string.IsNullOrWhitespace((string) v));

请注意,我已经解决了您代码中的下一个问题 - 您本应计算非 null/empty 值,但实际上您计算的是 null/空值。

关于c# - 这个对象能够告诉它有多少属性不是空/空白/空有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34309971/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com