當前位置:編程學習大全網 - 編程語言 - C#如何將Type type作為泛型t的參數t傳遞?

C#如何將Type type作為泛型t的參數t傳遞?

簡單的例子:

布爾方法& ltT & gt(bool參數)其中T:class

{返回參數;}

這是壹個完整的泛型方法,限定詞T:class表示泛型T的類型限制,請在MSDN查找“泛型類型約束”的詞條/library/bb384067.aspx。

使用泛型方法壹般用於涉及泛型(t)的方法:

泛型參數中至少有壹種類型,如method

返回值涉及泛型,比如list

方法需要基於參數泛型類型進行操作,比如方法內容為return T is IComparable

參數涉及不確定的類型,如方法

如果只需要傳入t類型,不需要返回涉及t的值,可以用Method(Type t)代替。

需要註意的是,泛型方法的意義在於減少了大量冗余代碼,並不能像樓主在1中說的那樣消除或自動處理if/else邏輯(但它允許妳只寫壹次if/else,而不是寫幾十次或幾百次)。

我不確定妳想問什麽。如果只是簡單的使用,我現在就舉個我寫的例子,涉及到以上四種使用場景。雖然看起來有點復雜,但是充分理解後熟練運用泛型方法不是問題。

我們的目標是寫壹個方法,接收兩個不定類型的參數,但是繼承自IEnumerable (enumerable接口),輸出壹個列表,這個列表是兩個參數的每個元素大小比較後的較大元素的集合。例如,輸入{1,3,4,5}和{2,2}應該是輸出{2,3,4,5}。

現在我們來分析壹下。首先,這個方法需要指出兩個參數的類型,分別定義為泛型類型T1和T2,這裏的限定條件是IEnumerable,這樣我們就可以隨意枚舉這兩個參數的元素了。

因為要比較元素的大小,而元素的類型是不確定的,所以需要壹個通用類型來指定兩個參數中元素的類型,這裏使用的是通用類型TElement。因為需要比較大小,所以在這裏添加了IComparable這個限定符,以防調用者傳入壹個根本無法比較的元素類型。

連同預期的輸出,該方法的特征是:

列表& lt遠程監控& gtElementsMax & ltTParam1,TParam2,TElement & gt(TParam1 p1,TParam2 p2)

其中tparam 1:IEnumerable & lt;遠程監控& gt

其中tparam 2:IEnumerable & lt;遠程監控& gt

where TElement:I comparable & lt;遠程監控& gt

我這裏直接把方法寫出來,不用細讀。基本思路是把兩個參數序列的元素壹個壹個拿出來比較,填入新的序列。唯壹需要註意的是,兩個參數序列的長度不壹定相等。

經過測試的完整方法:

列表& lt遠程監控& gtElementsMax & ltTParam1,TParam2,TElement & gt(TParam1 p1,TParam2 p2)

其中tparam 1:IEnumerable & lt;遠程監控& gt

其中tparam 2:IEnumerable & lt;遠程監控& gt

where TElement:I comparable & lt;遠程監控& gt

{

列表& lt遠程監控& gtrtn =新列表& lt遠程監控& gt();

int p1Length = p1count();

int p2Length=p2。count();

for(int index = 0;index & lt數學。最大(p1。Count(),p2。count());index++)

{

//如果p1和p2在索引位置都有元素,則比值大於大小。

//如果壹個序列為空,則判斷該非空序列的索引位置的元素較大。

TElement compRslt = default(遠程);

if(index & lt;p 1長度和長度。& ampindex & ltp2Length)

compRslt = p1。ElementAt(索引)。CompareTo(p2。element at(index))& gt;= 0 ?p1。ElementAt(索引):p2。ElementAt(索引);

else if(index & lt;p 1長度和長度。& ampindex & gt= p2Length)

compRslt = p1。ElementAt(索引);

else if(index & gt;= p 1長度& amp& ampindex & ltp2Length)

compRslt = p2。ElementAt(索引);

//如果compRslt的值不是我們壹開始構造的默認值,就說明有結果,而且是存儲的。

如果(compRslt。CompareTo(默認(遠程))!=0)

rtn。add(compRslt);

}

//btw,ICollection在Linq下有壹個Zip方法,可以有條件的合並兩個序列。

返回rtn

}

然後我們嘗試調用,我們可以直觀地看到使用泛型方法的好處。

string outputStr

//int測試

int[] array = new int[] { 2,1,1,6 };

列表& ltint & gtlst =新列表& ltint & gt{ 3, 1, 5, 5, 9 };

列表& ltint & gtresult = ElementsMax & ltint[],List & ltint & gt,int & gt(array,lst);

outputStr =

for(int index = 0;index & lt結果。count();outputStr += result[index++]。ToString() +",";

MessageBox。show(output str);

//字符測試

string s 1 = " Hello world ";

隊列& ltchar & gts2 =新隊列& ltchar & gt(《新年快樂》);

列表& ltchar & gt結果= ElementsMax & lt字符串,隊列& ltchar & gt,char & gt(s1,S2);

outputStr =

for(int index = 0;index & lt結果2。count();outputStr += result2[index++]。ToString()+",";

MessageBox。show(output str);

//也可以叠代使用。

int[] a1 = new int[] { 1,3,5,7,9 };

int[] a2 = new int[] { 2,4,6,8 };

int[] a3=new int[]{8,8,8,8,8 };

列表& ltint & gt結果= ElementsMax & lt列表& ltint & gt,int[],int & gt(ElementsMax & ltint[],int[],int & gt(a1,a2),a3);

outputStr =

for(int index = 0;index & lt結果3。count();outputStr += result3[index++]。ToString() +",";

MessageBox。show(output str);

實際的三組輸出是:

3,1,5,6,9,

h,e,p,p,y,,w,o,w,l,y,e,a,r,

8,8,8,8,9,

它符合我們的期望。

僅此而已。如果妳有任何問題,請PM我。

  • 上一篇:常用文件格式大全(五)
  • 下一篇:邯鄲職教中心的專業是什麽?
  • copyright 2024編程學習大全網