属性方法?

也许我忽略了一些明显的东西,但我在代码中看到过你可能有像“HairColor”这样的属性,然后是像“HairColor.Update()”这样的方法。 这可能吗?

Person person = new Person(int personID); person.HairColor = "Blonde"; person.HairColor.Update(); 

我有特定的属性,我希望能够根据具体情况进行扩展。 我想我可以有一个名为“HairColorUpdate”的方法,但似乎应该可以使用HairColor.Update()。 我不想使用“set”,因为我并不总是希望以这种方式更新DB。

我这样做的原因是因为我可能只想调用数据库来更新一列而不是调用我的save方法,该方法更新每一列有望提高效率。

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... } 

在你的代码中,只要是一个stringHairColor可以简单地分配你想要的任何东西:

 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(); 

实际上,混合人员类的业务逻辑和数据库相关的逻辑很少是好主意。 所以,我会去:

 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 } } 

这样,您可以通过特定function获得更多控制权。 记住,上课责任。

只有当你真的想要更新一列时,才能使用此解决方案。

希望有所帮助。