我正在寻找替换以下内容的方法:
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 :(得分: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
方法。