具有方法的属性

本文关键字:属性 有方法 | 更新日期: 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的方法。在您的示例中,看起来HairColorstring,因此要实现这一点,您需要实现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
     }
}

通过这种方式,您可以通过特定功能进行更多控制。记住,集体责任。

当然,只有当您真的想更新一列时,才可以使用此解决方案。

希望能有所帮助。