2011-09-02 187 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方法。