2011-04-18 93 views
2

我有一個通用函數,我想知道如何編寫。如何確定兩個對象的類型是否兼容?

List<Something> something; 

public int countItems<T>(List<T> Items) 
{ 
    // Here I would like to compare the type of "Items" with the type of "something" to see if they are compatible. How do I do it? 
    return 0; 
} 
+1

這真的取決於你的比較方法。什麼時候和Items一樣? – RoflcoptrException 2011-04-18 13:08:17

+0

'var tAsSomething = Items [0] as Something;如果(tAsSomething!= null)...'是我最好的猜測,如果我理解正確。 – 2011-04-18 13:10:04

+0

XY問題的陰影。第一條評論似乎是從字面上看原始問題標題的方式,所以我將標題改爲實際意義。 – 2017-10-22 00:08:12

回答

-1

我想你想要的是使用IComparable接口。

您可能想要使用的另一個工具是operator overloading,以便您可以定義在兩種情況下兩個對象相等的情況下如何處理

+0

問題是關於比較類型,而不是數值。 – 2017-10-22 00:27:06

+0

你已經編輯了一個6歲的問題(寫得不好),然後肯定地宣佈它「真的」意味着什麼。 FWIW我支持我的回答。有OP回來,澄清他們正在尋找什麼我可能已經提供了一個更完善的答案關於如何使用IComparable和運算符重載來完成手頭的任務。使用=的重載,你可以通過任何標準來檢查'兼容性'。我不同意它是_類型_,當使用列表時,所有項目的類型都是,因此在類型級別必須是「兼容的」。 – 2017-10-22 11:33:10

+0

這個問題的年齡是無關緊要的(但要熱愛廣泛防禦的虛僞),我的確定性是很有必要的,因爲它來自OP的例子中的評論,你顯然從來沒有讀過,所以你站在一些東西肯定是錯的。即使我的意思沒有錯,這也是一個不好的答案,因爲它需要修改可能不在OP控制範圍內的類。底線是我簡單的一行評論事實上是正確的,並且不值得您付出毫無意義的迴應。我不會再浪費我的時間。 – 2017-10-22 22:18:14

9

你的意思是:

if(typeof(T) == typeof(Something)) {...} 

注意,具有巨大的仿製藥依賴於T(和採取不同的)可能意味着你正在嘗試做的是不是其實很通用 ...

+0

OP可能想知道T是從Something還是v.v.派生的。這並不完全不合理,因爲您不能將'List '轉換爲'List '...,但是應該使用'IEnumerable '替代。 – 2017-10-22 00:25:58

0
if (something.GetType() == items.GetType()) ... 

這將比較類型實際的物體。

0

問題是不好說,比一個有點含糊多,但這可能做到這一點:

using System.Linq; 

public int countItems<T>(List<T> Items) 
{ 
    return Items.OfType<Something>().Where(thing => thisOneCounts(thing)).Count(); 
} 
相關問題