具有方法的属性
本文关键字:属性 有方法 | 更新日期: 2023-09-27 18:29:14
也许我忽略了一些明显的东西,但我在代码中看到,你可能有一个像"HairColor"这样的属性,然后有一个类似"HairColor.Update()"的方法。这可能吗?
Person person = new Person(int personID);
person.HairColor = "Blonde";
person.HairColor.Update();
我有一些特定的属性,我希望能够根据具体情况进行扩展。我想我可以有一个名为"HairColorUpdate"的方法,但似乎HairColor.Update()应该是可能的。我不想使用"set",因为我并不总是想以这种方式更新数据库。
我这样做的原因是,我可能只想调用数据库来更新一列,而不是调用我的保存方法来更新每一列,希望能提高效率。
person.HairColor.Update()
只是表示HairColor
属性返回的类型有一个名为Update
的方法。在您的示例中,看起来HairColor
是string
,因此要实现这一点,您需要实现string
的扩展方法。例如,类似的东西
static class StringExtension
{
public static void Update(this string s)
{
// whatever
}
}
然而,我不认为这样做有什么意义。Update
方法是一个对字符串有效的静态方法,因此它不会影响Person
实例。(即使string
确实具有Update
方法,它也与Person
类型无关)。
我相信您会希望在Person
上使用Update
方法,而不是像其他人所指出的那样。
这是不可能的,除非HairColor的返回值有Update()方法。另一种方法是使用
Person person = new Person(int personID);
person.HairColor = "Blonde";
person.Update();
更新方法检查哪些字段已更新,然后根据这些信息更新数据库。
HairColor
可能必须是一个结构类型才能使您想要的工作。此外,您还必须进行运算符重载。我不确定这是否真的是你想要追求的设计道路。如果由于某种反常的原因,您绝对必须这样做,这就是您需要的结构定义(非常粗略地说,LOL):
public struct HairColorStruct
{
private string m_hairColor;
public void Update()
{
// do whatever you need to do here...
}
// the very basic operator overloads that you would need...
public static implicit operator HairColorStruct(string color)
{
var result = new HairColorStruct();
result.m_hairColor = color;
return result;
}
public static explicit operator string(HairColorStruct hc)
{
return hc.m_hairColor;
}
public override string ToString()
{
return m_hairColor;
}
public static bool operator ==(HairColorStruct from, HairColorStruct to)
{
return from.m_hairColor == to.m_hairColor;
}
public static bool operator ==(HairColorStruct from, string to)
{
return from.m_hairColor == to;
}
public static bool operator !=(HairColorStruct from, HairColorStruct to)
{
return from.m_hairColor != to.m_hairColor;
}
public static bool operator !=(HairColorStruct from, string to)
{
return from.m_hairColor != to;
}
}
然后,您可以像这样重新定义Person
对象:
public class Person
{
public HairColorStruct HairColor { get; set; }
// whatever else goes here...
}
在您的代码中,只要是string
:,就可以简单地为HairColor
分配您想要的任何内容
var person = new Person();
person.HairColor = "Blonde";
// this will emit "True" to the console...
if (person.HairColor == "Blonde")
{
Console.WriteLine(true);
}
else
{
Console.WriteLine(false);
}
// update the info per your logic...
person.HairColor.Update();
// you can change the hair color and update again, LOL
person.HairColor = "Brown";
person.HairColor.Update();
它不是带方法的property
,但属性返回的type
内部声明了该方法。因此,您使用了一个属性,并在返回的值(即类型)中调用该方法。
我认为您需要对Person类使用Update方法,而不是对字符串使用Update方法:
Person person = new Person(int personID);
person.HairColor = "Blonde";
// set other properties
person.Update();
实际上,将person类的业务逻辑和数据库相关逻辑混合在一起很少是个好主意。所以,我会去类似的地方:
dbSession.SaveOrUpdate(person); // NHibernate
甚至扩展方法:
public static void Update(this Person person)
{
// connect to database and do update query
}
你就不能这么做吗:
public class HairColor : String
{
private int _personID;
public HairColor(int personID)
{
_personID = personID;
}
public void Update()
{
//update the database here for hair color
}
}
通过这种方式,您可以通过特定功能进行更多控制。记住,集体责任。
当然,只有当您真的想更新一列时,才可以使用此解决方案。
希望能有所帮助。