3

同じ基本抽象クラスから派生した、指定された (しかし動的な) タイプのオブジェクトがリストに含まれているかどうかを確認することは可能ですか?

主な問題はリストに関するものではなく、型自体の比較に関するものです。単一変数と静的変数では、次のように簡単です。

if(someVariable is int)

次のように、静的タイプでリストを確認するのも簡単です。

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

また

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

しかし、チェックしたい型が動的である場合、それを処理できません.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にいくつかの属性を配置し、各派生物に属性の一意の値を持たせることであることを認識していますが、それでも問題を解決するための別のルートを探しているわけではありません. 「この」方法でそれを行うことが可能かどうかに興味があります。

4

1 に答える 1

2

型が実行時にのみわかっている場合、リフレクションを使用しないとジェネリックで使用できません。ただし、タスクはそれよりも単純です。型の等価性を使用して、必要な結果を得ることができます。

Type targetType = pObject.GetType();
if (SomeList.Any(o => targetType.Equals(o.GetType()))) {
    ...
}
于 2013-05-25T12:44:48.030 に答える