2011-04-18 49 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(); 
} 
相关问题