編集:私はミスをしました、前提は間違っていました。 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).IsClass
とdefault(T).IsClass
を使用しても、System.Typeの戻り値の型は常にクラスであり、IsClassはデフォルトのTに使用できないため、機能しません。
どうすればいいですか?
あなたは、単純なキャストを試し、その後はnullかどうかを確認しましたか? http://stackoverflow.com/questions/13405714/is-versus-try-cast-with-null-check –
あなたのケースでは、コンパイラ例外がスローされない場合、オブジェクトTは常にIServiceを実装する必要があります。だから私はあなたの質問を理解していない。 – mybirthname
私は実際にTがインタフェースを実装しているかどうかを調べようとはしていません。私は、クラスのユーザが実装を使ってこのメソッドを呼び出さないようにしたい - 彼らはインターフェイスの戻り値の型で作業する必要があります。 – Joseph