2017-07-19 2 views
-1

指定された抽象クラスの汎用Tパラメータを受け入れる関数に渡される抽象クラスの実装があります。しかし何らかの理由で、具体的なクラスが指定されたコンテキストで有効ではないというエラーが表示されます。具体的なクラスは、型として渡されたときに特定のコンテキストでは無効です

何が起こっているかについてのアイデアは高く評価されます。

ヘルパーメソッド

public static async Task<bool> StartSingleAppService<T>(T type) where T : Service 
    { 
     // GetServiceMaintainer() gets a singleton of my Services list 
     if (ServiceMaintainer.GetServiceMaintainer() != null) 
     { 
      Service service = ServiceMaintainer.GetServiceMaintainer().FindServiceByType(type); 
      if (await ServiceMaintainer.StartService(service)) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

使用

// `UpdateService` is type not valid in the given context 
await AppServices.StartSingleAppService(UpdateService); 

UpdateService

public class UpdateService : Service 

サービス

public abstract class Service 

注:

  • Service抽象クラスは、抽象タスク・メソッドを定義します。 public abstract Task<bool> start();
  • Service抽象クラスは、カップルのメンバ変数
  • ​​クラスは抽象メソッドを実装し、カップルのヘルパー関数を持って定義しています。
+0

は、エラーの完全なコンテンツだけでなく、 'UpdateService'変数の宣言を投稿してください。 –

+0

@JonBそれは変数ではありません。これは型として扱われるクラスです。エラーは私が述べた以上のものではありません。 – visc

+0

'UpdateService'クラスのオブジェクトを使ってメソッドを呼び出すのですか、それとも' UpdateService'型をメソッドに渡していますか? –

答えて

3

あなたはリンゴと梨をひねり返します。現在宣言されているように、このメソッドは型を予期しません。型のインスタンスが必要です。おそらくあなたがしたいことは、パラメータを削除し、メソッドの中でtypeof-operatorを使うことです。

// argument removed here ------------------------------\/ 
public static async Task<bool> StartSingleAppService<T>() where T : Service 
{ 
    // GetServiceMaintainer() gets a singleton of my Services list 
    if (ServiceMaintainer.GetServiceMaintainer() != null) 
    { 
     Service service = ServiceMaintainer 
      .GetServiceMaintainer() 
      .FindServiceByType(typeof(T)); 
     // argument changed here --/\ 

     if (await ServiceMaintainer.StartService(service)) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

呼び出しサイトは少しあまりにも変更されます。

await AppServices.StartSingleAppService<UpdateService>(); 
+0

ありがとうございました – visc

関連する問題