2011-09-02 175 views
3

進出口尋找一種方式來替換以下安全:更換非類型與類型安全的泛型方法

public class NonTypeSafe 
{ 
    private List<object> contents = new List<object>(); 
    public List<object> Contents {get { return contents; }}; 

    public NonTypeSafe(params object[] arguments) 
    { 
     foreach(object arg in arguments) 
     { 
      contents.Add(arg); 
     } 
    } 
} 

的東西,是類型安全的。目的是讓我可以添加許多不同類型的物體。目前,檢索對象時必須進行檢查,以確定它們是否是正確的類型/按照正確的順序。

目前我有以下幾點:

public class TypeSafe<T1> 
    { 
    protected List<object> ArgList = new List<object>(); 

    private readonly T1 arg1; 

    public TypeSafe(T1 arg1) 
    { 
     ArgList.Add(arg1); 
     this.arg1 = arg1; 
    } 

    public T1 Arg1 
    { 
     get { return (T1) ArgList[ArgList.IndexOf(arg1)]; } 
    } 
    } 



    public class TypeSafe<T1, T2> : TypeSafe<T1> 
    { 

    private readonly T2 arg2; 

    public TypeSafe(T1 arg1, T2 arg2) : base(arg1) 
    { 
     ArgList.Add(arg2); 
     this.arg2 = arg2; 
    } 

    public T2 Arg2 
    { 
     get { return (T2) ArgList[ArgList.IndexOf(arg2)]; } 
    } 
    } 

等等,增加了新的類最多人數最多的參數,我會合理預期。有沒有更好的方法來實現這一目標?

+0

複雜的Ids,男人? :) –

+0

'ArgList'似乎是多餘的,因爲'arg1'和'arg2'字段中有相同的信息(並且在檢索時不需要強制轉換)。 –

回答

8

您是否正在重新設計System.Tuple

元組是具有特定數量和元素序列的數據結構。元組的一個例子是一個數據結構,它包含三個元素(稱爲三元組或三元組),用於存儲第一個元素中的人名,第二個元素中的年份和個人收入那是第三個元素。

+0

哇,謝謝!從來不知道那種類型。已經寫了幾次。 :) –

+0

它會出現這麼...該死的。謝謝您的幫助。 – richzilla

+1

@Michael - 它在.NET 4中是新的,所以如果你在發佈之前寫它,那沒有什麼比這更好的了。我不得不將它移植到幾次不準備遷移到.NET 4的項目上。 –

4

不,一般來說沒有更好的方法,因爲如果它們不是從公共基類派生或實現相同的接口,則不能將多個類型添加到通用列表中。
但是,您的類可以寫得更簡單一些,因爲您不需要數組,它不會添加任何值。相反,它增加了運行時和代碼的複雜性。

public class TypeSafe<T1> 
{ 
    private readonly T1 arg1; 

    public TypeSafe(T1 arg1) 
    { 
     this.arg1 = arg1; 
    } 

    public T1 Arg1 
    { 
     get { return arg1; } 
    } 
} 

public class TypeSafe<T1, T2> : TypeSafe<T1> 
{ 
    private readonly T2 arg2; 

    public TypeSafe(T1 arg1, T2 arg2) : base(arg1) 
    { 
     this.arg2 = arg2; 
    } 

    public T2 Arg2 
    { 
     get { return arg2; } 
    } 
} 
1

我認爲,你這樣做的方式是非常正確的。你可以欺騙一下,但是,不必定義很多類。只要您需要TypeSafe<T1, T2, T3>,請使用TypeSafe<TypeSafe<T1, T2>, T3>。雖然你會失去可讀性。因爲你的代碼中會有像typeSafe.Arg1.Arg1這樣的結構。此外,您需要覆蓋Equals方法。