2012-03-28 153 views
3

也許我忽視了一些顯而易見的東西,但是我在代碼中看到過可能有像「HairColor」這樣的屬性,然後是像「HairColor.Update()」這樣的方法。這可能嗎?屬性與方法?

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

我有特定的屬性,我希望能夠根據具體情況進行擴展。我想我可以有一個名爲「HairColorUpdate」的方法,但似乎HairColor.Update()應該是可能的。我不想使用「set」,因爲我並不總是希望以這種方式更新數據庫。

我這樣做的原因是因爲我可能只想調用數據庫來更新一列而不是調用我的save方法,該方法會更新每列以提高效率。

+3

您只是通過更新字段來使事情更加複雜。在你的Person類中提供一個更新所有字段的Update方法(使用參數)。 dbms幾乎沒有性能差異。 – 2012-03-28 21:36:40

+0

如果你想更新一列,我會看看我的答案。其他人也是很好的解決方案,但它只是我會做的。 B – Base33 2012-03-28 23:10:08

回答

8

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方法,而不是像別人指出的那樣。

+0

+1的延伸... – GETah 2012-03-28 21:29:56

+2

+1只是提到「我沒有看到這樣做的重點。」 – Jetti 2012-03-28 21:32:01

+0

@TimSchmelter:這是我試圖掩蓋與沒有多少意義的一部分。 – 2012-03-28 21:33:28

0

這不是一個property與一個方法,但type由屬性返回該方法聲明裏面。所以你使用一個屬性,並在返回的值中,這是類型,調用方法。

4

這是不可能的,除非HairColor的返回值有一個Update()方法。另一種方法是讓

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

更新方法檢查哪些字段已更新,然後基於該信息更新數據庫。

+0

+1這當然更有意義。 – 2012-03-28 21:32:01

+0

我想查看哪些屬性已更新,只更新這些屬性可能更有意義。這就是我正在努力實現的目標。當只需要更新一個字段時,我想避免更新整個記錄。 – 2012-03-28 23:37:18

0

我認爲你需要在Person類更新方法,而不是字符串更新方法:

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

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

在你的代碼,HairColor可以簡單地分配給任何你想要的,只要它是一個string

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

我正在爲OP寫這篇文章。打敗我吧。答案+1 – payo 2012-03-28 21:47:33

0

你不能只是做:

public class HairColor : String 
{ 
    private int _personID; 

    public HairColor(int personID) 
    { 
     _personID = personID; 
    } 

    public void Update() 
    { 
      //update the database here for hair color 
    } 
} 

這樣你就可以有特定功能的更多的控制。記住,班級責任。

這個解決方案只有當你真的想更新一列當然。

希望有所幫助。