我有:
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/