当类型是动态的并且两个变量都是相同基类的导数时,检查两个变量是否相同

时间:2013-05-25 12:37:13

标签: c#

是否可以检查列表是否包含给定(但动态)类型的对象,是否来自相同的基本抽象类?

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

if(someVariable is int)

使用静态类型检查列表也很容易,例如:

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

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

但如果我要检查的类型是动态的,我就无法处理它,例如。作为方法参数传递:

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并使每个导数具有该属性的唯一值,但仍然 - 我不是在寻找另一条路径来解决问题,我只是感兴趣,如果有可能以“这种”的方式做到这一点。

1 个答案:

答案 0 :(得分:2)

仅在运行时知道类型时,如果不使用反射,则不能在通用中使用它。但是,您的任务比这更简单 - 您可以使用类型相等来实现所需的结果:

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