当类型为动态且两个变量都是同一基类的派生时,检查两个变量是否相同

本文关键字:两个 变量 派生 是否 基类 检查 类型 动态 | 更新日期: 2023-09-27 18:15:23

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

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

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
}

p。我知道代码看起来不整洁,但我试图只显示问题本身,跳过额外的逻辑和东西。

PS2。我知道,问题的解决方案将只是把一些属性BasicClass,并使每个衍生有属性的唯一值,但仍然-我不寻找另一种途径来解决问题,我只是感兴趣,如果有可能做到这一点"这种"方式。

当类型为动态且两个变量都是同一基类的派生时,检查两个变量是否相同

当类型仅在运行时已知时,如果不使用反射,则不能在泛型中使用它。然而,您的任务比这更简单—您可以使用类型相等来实现您想要的结果:

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