2011-07-22 5 views
1

汎用クラス定義BaseClass<T>がある場合、この条件をテストできますか? Tが何であるかmyinstanceがGenericであるかどうかを確認<T>

if (myvar is BaseClass<>)

私はMYVARは、ジェネリッククラスから派生するかどうかを知りたいのですが、私が知っている(またはケア)はありません。

私は答えはいいえ...私のバックアップ計画は、myvar.GetType().ToString().Contains("BaseClass<")、または何かを介してこれをcavemanにすることです。このよう

+1

class BaseClass<T> : IBaseClass { } interface IBaseClass { public void SomethingUseful(); } 

は今、あなただけisオペレータが必要ですか? – SLaks

+2

ここでこれを行う方法については、多くの情報があります。 http://stackoverflow.com/q/457676/738380 –

+0

@Aaron実装リンクの感謝です。 – with

答えて

9

if (myVar.GetType().IsGenericType 
&& myVar.GetType().GetGenericTypeDefinition() == typeof(BaseClass<>)) 
+2

質問者が本当に「派生する」という意味であり、「正確な種類」でない場合は、質問者の提案もこれも正しいものではありません。正しい解決策は、現在の型だけでなく、すべての基本型もチェックするループ内で上記の方法を使用することです。 –

+0

@Corey:正しい。 'typeof(BaseClass <>) 'と比較する前に各基本型で' GetGenericTypeDefinition() 'を呼び出す必要があります。 – SLaks

+0

クールで、' T'を使わずに 'typeof(BaseClass <>) 'できることを知りませんでした。 @Coreyも正しいです、私は "派生する"ための階層を横断する必要があります。ありがとう! – with

0

私はSLaksの例を考えなければならないが、あなたの特定の質問に対応しています。

私はちょうど良いことをしていますか? Tを知らなければ、それを何かにキャストしたり、メンバーにアクセスすることはできません。

他の解決策は、非汎用インターフェースを使用して、実際にBaseClassで何かを行うことができるようにすることです。例えば:それは `DerivedClass `何場合

if (myVar is IBaseClass) 
    ((IBaseClass)myVar).SomethingUseful(); 
+0

これはパフォーマンスの最適化であり、悪質なコードに対して正当な理由があります:Pオブジェクトがジェネリック型から派生していない場合には、いくつかの作業をバイパスできます。インターフェイスが完全に機能すると、タイプを直接チェックするのが簡単になると思いました。 – with

関連する問題