2011-04-08 71 views
2

內的單選按鈕一樣的功能我碰到一個有趣的問題是,到目前爲止,我還沒有能夠找到一個很好的令人信服的答案。如何模仿你的代碼

想象我有一個窗體上的單選按鈕,三個選項分別是:出生

  • 日期
  • 數量的兄弟姐妹

當你實現這些作爲單選按鈕,你只能指定其中的一個。

現在想象我實際上也希望指定的值。所以我的形式看起來是這樣的:

  • 出生日期:YYYY/MM/DD
  • 數的兄弟姐妹:NN
  • 名稱:XYZ

所以,如果我選擇單選按鈕'出生日期',那麼我可以輸入日期時間作爲值,但是如果我選擇Name,那麼我想要一個字符串,並且,如果我想選擇Number of Siblings ,那麼我想要一個整數作爲值。

我不認爲這在形式設計上是特別突破性的。

有趣的問題是,到底我怎麼做到這一點使用C#代碼。讓我解釋。

我有一種方法,它接受類型的對象「PersonalityTrait」。然而,PersonalityTrait對象只能設置三個屬性中的一個,可以是出生日期,也可以是兄弟姐妹數量或名稱。它不能包含2個或更多屬性。我怎麼確保它只包含三個屬性中的一個?

我想過離開這個任務到使用這個對象來檢查它是否具有多個屬性集的任何代碼,但我不知道這個任務應該留給調用代碼。它違背了DRY(不要重複自己)的原則。另外我不相信調用代碼要保持警惕。

我想過PersonalityTrait對象,將對其進行驗證(通過檢查,只有一個屬性設置)創建的方法,但同樣,我不知道調用代碼將調用它。

我想過如何改變SET屬性的方法代碼來實際檢查其他屬性,並拋出一個異常,如果其他屬性已經設置好了,但感覺就像在表單上提供一個清單而不是一個單選按鈕並拋出一個異常如果用戶選擇了多個選項(這對用戶來說只是不直觀的!)。

如果這只是一個字段,我會創建一個枚舉並將其作爲三個選項之一(生日,兄弟或名稱數),但問題是,我也想接受一個VALUE,而我希望這個值是強類型的。

這似乎是一個喬恩 - 碟式問題的,LOL,我可能要審查「C#中的深度」推測這一個。但我想我現在將它發佈在StackOverFlow上!

+1

順便說一句,請不要在標題中加入「C#」 - 你已經在標籤中找到它了。 – 2011-04-08 01:07:59

+0

這聽起來像是泛型的完美使用。已發佈的答案似乎都是正確的。擁有3個獨立的屬性是不好的設計,你會得到過於複雜的代碼和更多的錯誤機會。 – takteek 2011-04-08 01:23:36

回答

0

有點想在這裏大聲,所以它可能沒有多大意義。我會有一個enumPersonalityTrait

enum PersonalityTrait 
{ 
    DateOfBirth, 
    NumberOfSiblings, 
    Name 
} 

你可以有一個通用的PersonalityTraitValue<T>

public class PersonalityTraitValue<T> 
{ 
    public T Value { get; set; } 
    public PersonalityTrait Trait { get; set; } 
} 

的你可以有一個接受enum並返回一個PersonalityTraitManagerPersonalityTraitFactory類/套PersonalityTraitValue<T>實例。

正如我所說,這可能不是最好的想法,但它是第一個想到的。

0

也許是這樣的:

class DataHolder<T> 
{ 
    private T datacontainer; 

    public DataHolder(T input) 
    { 
     datacontainer = input; 
    } 
    public DataHolder() {} 

    public T Data 
    { 
     get { return datacontainer; } 
     set { datacontainer = value; } 
    } 
} 
0

也許:

class MyDataHolder { 
    int numberOfSiblings = -1; 
    public property int NumberOfSiblings { 
     get { 
      ClearData(); 
      numberOfSiblings = value; 
     } 
    } 

    DateTime dateOfBirth = null; 
    public property DateTime DateOfBirth { 
     get { 
      ClearData(); 
      dateOfBirth = value; 
     } 
    } 

    String name = null; 
    public property String Name { 
     get { 
      ClearData(); 
      name = value; 
     } 
    } 


    private void ClearData() { 
     numberOfSiblings = -1; 
     dateOfBirth = null; 
     name = null; 
    } 


    public object GetData() { 
     if (numberOfSiblings != -1) { 
      return numberOfSiblings; 
     } 
     else if (dateOfBirth != null) { 
      return dateOfBirth; 
     } 
     else if (name != null) { 
      return name; 
     } 

     return null; 
    } 
} 
1

什麼是從這個問題缺少的是容器作爲參數傳遞給方法(我知道的海報,並討論了需要這與他)。

我喜歡泛型的想法。我想是這樣的:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var param = new Container<int>(){ Name = "Age", Value = 60}; 

     Test(param); 

    } 

    public static void Test<TType>(Container<TType> container) 
    { 

     Console.Write(string.Format("{0} = {1}", container.Name, container.Value)); 
     Console.ReadLine(); 


    } 

} 

public class Container<TType> 
{ 
    public string Name { get; set; } 
    public TType Value { get; set; } 
} 

我不愛的魔法弦,特別是因爲這將最終被通過Web服務暴露的公共API。

+0

是的,將容器作爲參數傳遞給方法的必要性絕對是問題的一部分。 – FullOfQuestions 2011-04-08 02:30:15