2013-07-24 72 views
0

我需要一點幫助我正在使用一個類,並且想要根據類型int,字符串和日期時間的選擇設置屬性這裏是我編寫的代碼,但由於我的構造函數會混淆public字符串paramValue和公共int? paramValue什麼是設置一個基於選擇屬性,以便只有一個屬性可以設置一個用於說明謝謝任何建議基於選擇的C#屬性

public class PassData 
{ 
    private string _ParamName { get; set; } 
    private int? _ParamValueInt { get; set; } 
    private string _ParamValueString { get; set; } 
    private DateTime? _ParamValueDateTime { get; set; } 


    public string paramName 
    { 
     get { return _ParamName; } 
     set { _ParamName = value;} 
    } 

    public string paramValue 
    { 
     get { return _ParamValueString; } 
     set {_ParamValueString = value; } 
    } 

    public int? paramValue 
    { 
     get { return _ParamValueInt; } 
     set { _ParamValueInt = value; } 
    } 

    public PassData(string ParamName, int ParamValue) 
    { 
     paramName = ParamName; 
     paramValue = ParamValue; 
    } 
    public PassData(string ParamName, string ParamValue) 
    { 
     ParamName = ParamName; 
     ParamValueString = ParamValue; 
    } 
    public PassData(string ParamName, DateTime ParamValue) 
    { 
     ParamName = ParamName; 
     ParamValueDateTime = ParamValue; 
    } 
} 
+3

您的代碼無法編譯。你不能有兩個同名的屬性。如果可以的話,你不應該這樣做。思考好名字很難,但它是一半的工作。這將防止這成爲一個問題。 –

+1

您不能用兩種不同的返回類型聲明兩次相同的屬性名稱。 – nicholas

+1

您對屬性和參數的使用有點困惑。 – Schaliasos

回答

1

基本上最好的辦法,你不能有多個性質的對象,只有對不同按類型。你有幾個選擇。

1)創建一個可以容納不同類型的單個屬性:

private Object _paramValue; 
public Object ParamValue 
{ 
    get { return _paramValue; } 
    set {_paramValue= value; } 
} 

在你的二傳手,你可以拋出一個異常,如果該值是你不喜歡的類型。你也必須upcast每次你打電話給getter的結果,使得這個解決方案並不理想。如果你想走這條路線,我建議讓該屬性爲接口,併爲你需要的數據類型定義各種實現。

2)創建一個泛型類:

public class PassData<T> 
{ 
    private T _paramValue; 
    public T paramValue 
    { 
     get { return _paramValue; } 
     set {_paramValue= value; } 
    } 
} 

這有實例被創建後,不能夠變化類型的缺點。目前還不清楚這是否是對您的要求。

我喜歡這個設計,因爲它提供了製造的構造此類私人的可能性:

public class PassData<T> 
{ 
    private PassData(T value) 
    { 
     this._paramValue = value; 
    } 
} 

如果你這樣做,你可以創建重載靜態方法來允許實例的創建:

public static PassData<String> CreateValue(string value) 
{ 
    return new PassData<String>(value); 
} 

public static PassData<Int32> CreateValue(Int32 value) 
{ 
    return new PassData<Int32>(value); 
} 

這樣,您就可以控制可以創建哪些類型。

+0

感謝邁克讓我試試你的方式。+ 1爲第一個答案 – Pamma

+0

靜態方法需要泛型類型參數。 – asawyer

+0

@MikeChristensen我明白你想做什麼,但就目前而言,這不會被編譯。 '使用泛型類型'UserQuery.PassData '需要1個類型參數' – asawyer

1

不是一個答案(就像邁克克里斯坦森的答案所涵蓋的那樣,它不能爲你提供一種方法去做你想做的事情)。我只是想更多地瞭解你爲什麼試圖做不起作用。 你對它的期望本身並不是不合理,問題是c#在返回值上不是多態。我認爲其他一些語言是,C#不是。

即同時在C#中,你可以這樣做:

public void test(int val) {} 
public void test(string val) {} 
// When you call `test` with either an int or a string, 
// the compiler will know which one to call 

你不能做:

public int test() {return 1;} 
public string test() {return "1";} 
// does not compile. The compiler should look at the call 
// site and see what you assign the result of "test()" to 
// to decide. But there are various edge cases and it was decided 
// to leave this out of the language 

現在,string paramValueget是功能上等同於這種情況。您試圖讓編譯器根據返回值決定調用哪個paramValue。

+0

對於一個好的建議+1並提供給我知識。我可能需要深入閱讀C#。 – Pamma

+0

@Pamma順便說一句,如果你想表達一個可以包含字符串或int或DateTime的類型,你可能想看看這個問題的接受答案:http://stackoverflow.com/問題/ 3151702 /歧視工會在C - 銳(也看看評論,其中朱麗葉提供了一個更美麗的選擇,國際海事組織) –