2016-11-23 3 views
-1

編集:私はミスをしました、前提は間違っていました。 typeof(T).IsClassは実際には動作しますが、typeof(T)IsInterfaceも同様に指摘されています。C#では、ジェネリック型Tがインターフェイスを実装していないかどうかをどのように判断できますか?

が、私はこの方法を持っていると言う:

public T GetService<T>() where T : IService 

私はジェネリック型かどうかをテストしたい、Tは、インタフェースとしてではなく、クラスとしてこのメ​​ソッドに送信されました。つまり、MyClass.GetService<IService>()MyClass.GetService<ImplementingClass>()のコールを区別したいと思います。これどうやってするの?

私はis objectを使用してみました、とis System.Objectが、それはこの区別をすることはありません。 typeof(T).IsClassdefault(T).IsClassを使用しても、System.Typeの戻り値の型は常にクラスであり、IsClassはデフォルトのTに使用できないため、機能しません。

どうすればいいですか?

+0

あなたは、単純なキャストを試し、その後はnullかどうかを確認しましたか? http://stackoverflow.com/questions/13405714/is-versus-try-cast-with-null-check –

+0

あなたのケースでは、コンパイラ例外がスローされない場合、オブジェクトTは常にIServiceを実装する必要があります。だから私はあなたの質問を理解していない。 – mybirthname

+0

私は実際にTがインタフェースを実装しているかどうかを調べようとはしていません。私は、クラスのユーザが実装を使ってこのメソッドを呼び出さないようにしたい - 彼らはインターフェイスの戻り値の型で作業する必要があります。 – Joseph

答えて

1

以下のようにランタイムを確認できると思います。

typeof(T).IsInterface 

Please check this link詳細については、私はあなたのケースをテストし

0

私の前提が間違っていました。

typeof(T).IsClass 

インターフェイスが指定されている場合はfalseを返します。

1

、typeof演算(T).IsClassが動作しない

関連する問題