2

所与のコレクション

IEnumerable<Type> supportedTypes

特定のオブジェクトがこれらの型 (または派生型) の 1 つであるかどうかを確認する最良の方法は何ですか?

私の最初の本能は、次のようなことをすることでした:

// object target is a parameter passed to the method in which I'm doing this.
if (supportedTypes.Count( supportedType => target is supportedType ) > 0)
{
    // Yay my object is of a supported type!!!
}

..しかし、それは機能していないようです。このようなラムダ式で「is」キーワードを使用できませんか?

4

2 に答える 2

2

Containsとを使わないのはなぜtarget.GetTypeですか。

bool ar isSupported = supportedTypes.Contains(target.GetType());

またAny

bool isSupported = supportedTypes.Any(t => t == target.GetType());

Enumerable.Countシーケンスに一致する要素が含まれているかどうかを知りたいだけの場合は使用しないでください。シーケンスが大きい場合や述語が高価な場合はかなり非効率的です)

編集:継承を考慮したい場合は、次を使用できますType.IsAssignableFrom

var isSupported = supportedTypes.Any(t => target.GetType().IsAssignableFrom(t));
  • is演算子は、インスタンスが特定の型と互換性があるかどうかを確認するために使用されます。
  • このIsAssignableFromメソッドは、Type が特定の型と互換性があるかどうかを確認するために使用されます。

指定された Type のインスタンスから現在の Type のインスタンスを割り当てることができるかどうかを判断します。

于 2012-10-26T22:38:39.757 に答える
2

OK、質問を入力し、さらに実験を行って、本当にばかげたことを尋ねていないことを確認しているときに、簡単な解決策に気づきました。他の誰かが同じように愚かなことをした場合に備えて、ここに投稿してください。;-)

ラムダ式で「is」キーワードを使用することはできませんが、次のものを使用できます。

supportedType => supportedType.IsInstanceOfType(target)

降伏:

if (supportedTypes.Count( supportedType => 
supportedType.IsInstanceOfType(target)) > 0)

if (supportedTypes.Any( supportedType => 
                              supportedType.IsInstanceOfType(target)))
// object target is a parameter passed to the method in which I'm doing this.
{
    // Yay my object is of a supported type!!!
}

以下のコメントで、.Count(...) > 0 ではなく .Any(...) を使用するべきだったことを指摘してくれた Bob Vale に感謝します。

于 2012-10-26T22:29:25.963 に答える