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