用类型安全通用方法替换非类型安全

时间:2011-09-02 13:01:50

标签: c# generics type-safety

我正在寻找替换以下内容的方法:

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)]; }
    }
  }

等等,添加新类到最大数量参数我会合理地期望。有没有更好的方法来实现这一目标?

3 个答案:

答案 0 :(得分:7)

您是否正在重新发明System.Tuple

  

元组是一种具有特定数量和元素序列的数据结构。元组的一个示例是具有三个元素(称为3元组或三元组)的数据结构,用于存储标识符,例如第一元素中的人名,第二元素中的年份以及人的收入。那一年的第三个元素。

答案 1 :(得分:5)

不,通常没有更好的方法,因为如果它们不是从公共基类派生或实现相同的接口,则不能将多个类型添加到通用列表中。
但是,您的类可以编写得更简单一些,因为您不需要该数组,它不会添加任何值。相反,它增加了运行时和代码复杂性。

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

答案 2 :(得分:1)

我认为,你这样做的方式非常正确。但是,您可以稍微欺骗它,而不必定义很多类。如果您需要TypeSafe<T1, T2, T3>,请使用TypeSafe<TypeSafe<T1, T2>, T3>。但是你会失去可读性。因为你的代码中会有像typeSafe.Arg1.Arg1这样的结构。此外,您还需要覆盖Equals方法。