2013-05-25 46 views
3

是否可以检查列表是否包含给定(但是动态)类型的对象,该对象来自相同的基本摘要类?当类型是动态的时候检查两个变量是否相同,并且这两个变量都是相同基类别的派生类型

主要问题不在于列表,而在于比较类型本身。 在单变量和静态变量,它很容易:

if(someVariable is int) 

检查与静态类型列表中也很容易,如:

SomeList.OfType<int>().Any() 

(from _Object in SomeList.OfType<int> where _Object is int select _Object).Count() == 0 

但我cant't处理它,如果我想检查的类型是动态的,fe作为方法参数传递:

abstract class BasicClass; 
class DerivativeOne : BasicClass { } 
class DerivativeTwo : BasicClass { } 

// in main: 

List<BasicClass> _List = new List<BasicClass>(); 
DerivativeOne a = new DerivativeOne(); 
DerivativeTwo b = new DerivativeTwo(); 
DerivativeOne c = new DerivativeOne(); 

if(!CheckIfTypeExistsInList(a, _List) 
{ 
    _List.Add(a); 
} 
if(!CheckIfTypeExistsInList(b, _List) 
{ 
    _List.Add(b); 
} 
if(!CheckIfTypeExistsInList(c, _List) 
{ 
    _List.Add(c); // this is what I don't want to happen, 
      // because I already have one object of type DerivativeOne in my list. 
} 


// the function: 
bool CheckIfTypeExistsInList(BasicClass pObject, List<BasicClass> pList) 
{ 
    /// few attempts: 
    pList.OfType<(pObject.GetType()>().Any(); // attempt one, error 
    return (from _Object in SomeList.OfType<(pObject.GetType())> where _Object is int select _Object).Count() == 0; // attempt two, error 
} 

PS。我意识到代码看起来并不整齐,但我试图只显示问题本身,忽略了额外的逻辑和内容。

PS2。我知道解决这个问题的方法就是给BasicClass添加一些属性,并让每个派生类都具有唯一的属性值,但仍然 - 我不想寻找另一条路径来解决问题,我只是如果有可能以“这个”的方式来做这件事,那么就很有兴趣

+0

泛型是编译时的事情,你不能把一个运行值在<>我肯定你发现了。 – SteveM

回答

2

只有在运行时才知道类型,不能在不使用反射的情况下在泛型中使用它。然而,你的任务是简单得多 - 你可以使用类型相等以达到你想要的结果:

Type targetType = pObject.GetType(); 
if (SomeList.Any(o => targetType.Equals(o.GetType()))) { 
    ... 
} 
+0

我已经试过这种方式,但不幸的是它不能正常工作......我认为问题在于两个变量都是同一类的衍生物,所以IsAssignableFrom不会做它的工作。 –

+0

@KamilT如果'targetType'是'o'类型的基类型,则表达式计算为'true'。你能否显示两种类型及其基础的类型层次结构,并告诉你想要评估哪些组合为“真”,哪些组合为“假”? – dasblinkenlight

+0

(对不起,格式化评论很难,所以它不太可读...)层次结构显示在我的问题中,我想实现的结果是fe:typeof DerivativeOne == typeof DerivativeOne - > true, typeof DerivativeOne == typeof DerivativeTwo - > false, typeof DerivativeOne == typeof BasicClass - > false –

相关问题