c# - 类属性——属性为空时通过扩展方法填充

标签 c# extension-methods

我有:

public class NameClass
{
 public NameClass(){}
 string Name {get; set;}
 bool IsValid {get; set;}
}

public class Person
{
 public Person() {}
 public NameClass Name {get; set;}
}

扩展方法:

public static void FillIt(this NameClass c, string name)
{
 if (c == null)
 {
  c = new NameClass();
 }
 if (string.IsNullOrEmpty(name) == false)
 {
  c.IsValid = true;
 }
 c.Name = name;
}

然后有空创建Person实例:

private void CreateMyPerson()
{
 Person p = new Person();
 p.Name.FillIt(txtName.Text);

 if (p.Name == null) Response.Write("Ooops, PROBLEM!");
 // checking for filled p.Name - IT IS STILL null - WHY?
}

谷歌搜索对我没有帮助,我的母语不是英语,也许我不能很好地问问谷歌叔叔。

使用扩展方法填充属性在我看来是最优雅的赋值方式,但是虽然在扩展方法中“c”变量似乎被初始化并设置得很好,但稍后检查 p .Name为null - 原来是未设置...

有什么线索吗?

最佳答案

当你这样做时:

c = new NameClass();

您没有将 NameClass 的实例分配给 Person 对象的属性。您将其分配给 局部变量 c。一旦完成赋值,该局部变量就不再与对 Person 类的属性的引用有任何关系。

如果你总是想要初始化 Name,在 Person 构造函数中进行:

public Person()
{
    this.Name = new NameClass();
}

然后您的扩展方法不需要首先检查 null:

public static void FillIt(this NameClass c, string name)
{
    if (string.IsNullOrEmpty(name) == false)
    {
        c.IsValid = true;
    }
    c.Name = name;
}

由于 c 在这个版本中从未被重新分配,它仍然指向 Person 对象上的属性。

虽然这取决于您要在这里完成的任务,但您是否根本需要这种扩展方法?如果 要求 Person 有一个名字,您可以在 Person 构造函数中要求它。和/或在 NameClass 构造函数上。

初始化一个对象然后检查它是否有效是两个步骤,但在初始化时要求它是有效的只需要一个步骤。如果不应该允许“无效”对象,则根本不允许。

关于c# - 类属性——属性为空时通过扩展方法填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45839642/

相关文章:

c# - 从 .jks 文件生成/转换 .keystore 文件,因为#unity 不接受 .jks

c# - try block 内的通用输出值赋值

c# - LINQ 语句在被包装到扩展方法后不再有效

swift - 检查 Swift 字典扩展中的 nil 值

c# - 从 F# 代码使用 C# 中定义的扩展方法

javascript - ASP.Net Core 3 将 JSON 数组发布到 Controller

c# - 使用 LINQ 编辑复合键值

c# - C# 中混合数据类型的数组

c# - 如何通过 RDP 手动更改云上的辅助角色文件?

.net - 枚举扩展方法