是否可以检查列表是否包含给定(但动态)类型的对象,是否来自相同的基本抽象类?
主要问题不在于列表,而在于比较类型本身。 在单变量和静态变量中,很容易:
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并使每个导数具有该属性的唯一值,但仍然 - 我不是在寻找另一条路径来解决问题,我只是感兴趣,如果有可能以“这种”的方式做到这一点。
答案 0 :(得分:2)
仅在运行时知道类型时,如果不使用反射,则不能在通用中使用它。但是,您的任务比这更简单 - 您可以使用类型相等来实现所需的结果:
Type targetType = pObject.GetType();
if (SomeList.Any(o => targetType.Equals(o.GetType()))) {
...
}