在我前面的文章利用.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.