在我前面的文章利用.net泛型实现了一个Tuple.在这两天的使用中发现还要再加点东 西才能好用.有三个地方:1Tuple要想Array,Enum,Delegate一样有一个基类,这样在不确定 Tuple类型参个数时可以用这个基类.2.要增加一个判断函数,用来确定任意给定的一个对 象是否属于Tuple中的类型(也许再加一个判定是否Tuple内的item的函数).3.增加默认构 造,这样做是为了那些只要类型而无需具体对象的场合.
//只贴出Tuple<T1>和Tuple<T1, T2>的代码,其他的自己加
public class Tuple
...{
public Tuple() ...{}
//具体判断两个类型是否一致
protected bool JudgeType<T, V>(T t, V v)
...{
return typeof(T).Equals(v.GetType());
}
//Tuple中是否有这种类型
public virtual bool HasType<V>(V v)
...{
return false;
}
};
public class Tuple<T1> : Tuple
...{
T1 _t1;
public Tuple(T1 t1)
...{
this._t1 = t1;
}
public Tuple() : this(default(T1)) ...{}
public T1 Item_1
...{
get...{return this._t1;}
}
public override bool HasType<V>(V v)
...{
return base.HasType<V>(v) || this.JudgeType(this._t1, v);
}
};
public class Tuple<T1, T2> : Tuple<T1>
...{
T2 _t2;
public Tuple(T1 t1, T2 t2) : base(t1)
...{
this._t2 = t2;
}
public Tuple() : this(default(T1), default(T2)) ...{ }
public T2 Item_2
...{
get...{return this._t2;}
}
public override bool HasType<V>(V v)
...{
return base.HasType<V>(v) || base.JudgeType(this._t2, v);
}
};
在这里要说明一下protected bool JudgeType<T, V>(T t, V v) 函数,它非常简单就是判断两个类型是否一致.不过要注意它的实现return typeof (T).Equals(v.GetType());其中T代表Tuple中的类型它使用typeof得到类型而v用GetType 得到类型.这是因为GetType拿到的是对象的真实类型,而typeof(T)是对象基类型.
class A1 ...{}
class A2 : A1 ...{}
Tuple<A2> t = new Tuple<A2>();
A1 a1 = new A2();
t.HasType(a1); //返回true
如果return typeof(T).Equals(typeof(V));会返回false,因为V被认成是A1而不是 A2.