2011-12-19 11 views
7

私はこのジェネリックを指定しようとしましたが、私は複数のエラーを取得しています:場所を指定してジェネリックを指定するにはどうすればよいですか?

public void AddOrUpdate(T item, V repo) where T: IAuditableTable, V: IAzureTable<TableServiceEntity> 
    { 
     try 
     { 
      V.AddOrUpdate(item); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding account"); 
      throw _ex; 
     } 
    } 

たとえば「:」最初の行にVがエラーを与えた直後に:

Error 3 ; expected 

プラスその他のエラー:

Error 2 Constraints are not allowed on non-generic declarations 
Error 6 Invalid token ')' in class, struct, or interface member declaration 
Error 5 Invalid token '(' in class, struct, or interface member declaration 
Error 7 A namespace cannot directly contain members such as fields or methods 
Error 8 Type or namespace definition, or end-of-file expected 

私の一般的なコーディングで明らかに間違っていますか?

更新:

私は変更を行い、コードは次のようになります。あなたがのために第二whereが必要

public void AddOrUpdate(Account account) 
    { 
     base.AddOrUpdate<Account, IAzureTable<Account>>(account, _accountRepository); 
    } 
+6

する必要がありますあなたは、おそらく 'スローする必要があります;'ここではなくスローEX 'より;'。それ以外の場合は、元のスタックトレースを送信します。 –

答えて

12

public void AddOrUpdate<T, V>(T item, V repo) 
     where T : Microsoft.WindowsAzure.StorageClient.TableServiceEntity 
     where V : IAzureTable<TableServiceEntity> 
    { 
     try 
     { 
      repo.AddOrUpdate(item); 
     } 
     catch (Exception ex) 
     { 
      _ex.Errors.Add("", "Error when adding account"); 
      throw _ex; 
     } 
    } 

は、派生クラスからそれを呼び出しますV

public void AddOrUpdate<T, V>(T item, V repo) 
    where T : IAuditableTable 
    where V : IAzureTable<TableServiceEntity> 

whereには、1つのタイプパラメータの制約がリストされています。メソッドに型パラメータを追加したことに注意してください。そうでなければ、コンパイラは通常の型としてTVを探していて、なぜそれらを制約しようとしているのか分かりません。

+0

ありがとうございました。これは私に提案された方法とは非常に異なっています。私は今試してみる。 –

+0

私は今、8つのエラーから "V.AddOrUpdate(item)"を指し示す1つのエラーだけになりました:Error 'V'は、指定されたコンテキストでは有効ではない 'type parameter' –

+0

@SamanthaJ:そうです、それはJamiecの答えが適切なところです。ちょうどうまくいかない*静的なメソッドを呼び出そうとしていない限り。 –

5

いくつかのことは間違っているようです。

1)@ジョンは、あなたが別のwhere

2を必要とし、言ったように)あなたがメソッドにジェネリックを定義する必要があります。

public void AddOrUpdate<T,V>(T item, V repo) where .... 

3)あなたは上のメソッドを呼び出すようにしようとしていますVこのタイプのインスタンスではありませんrepo。すなわち、この:

V.AddOrUpdate(item); 

repo.AddOrUpdate(item); 
関連する問題