web-dev-qa-db-ja.com

複数の制約を持つ一般的な方法

2つの汎用パラメーターを持つ汎用メソッドがあります。以下のコードをコンパイルしようとしましたが、動作しません。 .NETの制限ですか?異なるパラメーターに複数の制約を設定することは可能ですか?

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, TResponse : MyOtherClass
228
Martin

これを行うことは可能ですが、構文が少し間違っています。コンマで区切るのではなく、制約ごとに where が必要です。

public TResponse Call<TResponse, TRequest>(TRequest request)
    where TRequest : MyClass
    where TResponse : MyOtherClass
373
LukeH

@LukeHによる主な答えに加えて、依存関係の挿入に問題があり、これを修正するのに時間がかかりました。同じ問題に直面している人のために、共有する価値があります:

public interface IBaseSupervisor<TEntity, TViewModel> 
    where TEntity : class
    where TViewModel : class

この方法で解決されます。コンテナ/サービスでは、キーはtypeofであり、カンマ(、)

services.AddScoped(typeof(IBaseSupervisor<,>), typeof(BaseSupervisor<,>));

これはこれで言及されました answer

@LukeHによる別の使用法による主な答えに加えて、クラスの代わりに複数のインターフェイスを使用できます。 (1クラスおよびnカウントインターフェイス)このように

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : MyClass, IMyOtherClass, IMyAnotherClass

または

public TResponse Call<TResponse, TRequest>(TRequest request)
  where TRequest : IMyClass,IMyOtherClass
1
Hamit YILDIRIM