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